zoukankan      html  css  js  c++  java
  • 32 C++常见错误集锦

    下列程序中,K的值为:6

    enum {
    a,b=5,c,d=4,e
    }k;
    K=c;
    

      分析:enum中,首元素不赋值的话,默认为0;后一个元素不赋值的话比前一个元素大1.

     程序运行正常。

    #include<iostream>
    using namespace std;
    int main() {
             http://www/taobao.com
             cout<<"welcometo taobao"<<endl;
    }
    

    分析:(http:)相当于一个label,类似于访问限定符private,public;程序可以正常运行。

    双斜杠之后的www.csdn.NET被当做注释了,那么前面的http:是否合法?这就是C++中一个几乎不会被用到的语法,标签。
    带标签的语句是一种特殊的语句,在语句前面有一个标识符(即标签,上段代码中的http)和一个冒号。
    使用goto label就可以跳到标签处执行,比如可以在代码中写goto http,这样就会执行cout语句了。case就是一种标签,case关键字和它对应的值一起,称为case标签。类中的public、private、protect也是标签,称为成员访问标签。

     

    若PAT是一个类,则程序运行时,语句”PAT(*ad)[3];”调用PAT的工作函数次数是:0

    分析:PAT(*ad)[3];

    ad首先是个指针;

    ad是个指向有着三个PAT元素的数组的指针;

    这里只是声明了指针,虽然指针指向的数组有三个PAT对象,但是没有实例化其中的对象,所以并没有调用构造函数。

    某些运算符必须重载位成员函数,比如operator new;

    某些运算符必须重载位非成员函数,比如 operator >>……

    代码生成阶段的主要任务:把中间代码变换成依赖具体机器的目标代码。

    源码 ->(扫描)-> 标记 ->(语法分析)-> 语法树 ->(语义分析)-> 标识语义后的语法树 ->(源码优化)-> 中间代码 ->(代码生成)-> 目标机器代码 ->(目标代码优化)-> 最终目标代码

    共享内存:是在2个正在运行的进程间传递数据的一种非常有效方式。共享内存允许两个不相关进程访问同一个逻辑内存。由于它们并没有提供同步机制,所以我们通常需要用其他的机制来同步访问共享的内存。

    进程间通信方法有:文件映射、共享内存、匿名管道、命名管道、邮件槽、剪切板、动态数据交换、对象连接与嵌入、动态连接库、远程过程调用等

    几种进程间的通信形式:管道、有名管道、信号量、信号、共享内存、消息队列、套接字

    几种线程间的同步形式:事件、临界区、互斥量、信号量

    static成员函数,static成员是类的组成部分并不是任何对象的组成部分,因此,static成员函数没有this指针。我们知道,一般而言,类中的成员函数具有一个附加的隐含实参,即指向该类对象的一个指针。这个隐含实参命名为this。因为static成员函数不是任何对象的组成部分,所以static成员函数就没有this形参了。由于成员函数声明为const说明该成员函数不会修改该成员函数所属的对象,所以static成员函数不能声明为const。为什么呢?因为static成员函数不是任何对象的组成部分。static成员函数可以直接访问所属类的static成员,但是不能直接使用非static成员函数!也不能访问static const 类型的成员!

     

    补充:

    1) 静态成员变量可被该类的所有方法访问;(静态成员属于整个类,而不是某个对象,可以被所有方法访问,所有子类也可以访问父类静态成员)

    2) 该类的静态方法只能访问该类的静态成员函数;(不能访问非静态成员函数)

    3) 静态成员可以被任一对象修改,修改后的值可以被所有对象共享;

    4) 子类可以访问父类的静态成员

    5) 静态成员无多态性

    8、内联函数,当函数代码较小且被频繁调用的时候,最有用。

    分析:内联函数只适合于只有1~5行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对来说微不足道,所以也没有必要用内联函数实现。

    在内联函数内不允许用循环语句和开关语句。否则编译将该函数视同普通函数。

     

    内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。内联扩展是用来消除函数调用时的时间开销。它通常用于频繁执行的函数。一个小内存空间的函数非常受益。

    C代码中的,最后一行chardata[0];的作用:方便管理内存缓冲区、减少内存碎片化

    typedef struct list_t {
             structlist_t *next;
             structlist_t *prev;
             chardata[0];
    }list_t;
    

      

    分析:柔性数组,它只能放在结构体末尾,

    申明一个长度为0的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量,数组名这个符号本身代表了一个不可修改的地址常量(注意:数组名永远都不会是指针!),但对于这个数组的大小,我们可以进行动态分配 请仔细理解后半部分,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!

     

    对于0长数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等:

    注意:构造缓冲区就是方便管理内存缓冲区,减少内存碎片化,它的作用不是标志结构体结束,而是扩展。

    柔性数组是C99的扩展,简而言之就是一个在struct结构里的标识占位符(不占结构struct的空间)。

    10 

    假设CSomething是一个类,执行下面这些语句后,内存里创建了6个CSomething对象。

     

    CSomething a();//没有创建对象,这里不是使用默认构造函数,而是定义了一个函数,在C++ Primer393页中有说明。

    CSomething b(2);//使用一个参数的构造函数,创建了一个对象。

    CSomething c[3];//使用无参构造函数,创建了3个对象。

    CSomething &ra=b;//ra引用b,没有创建新对象。

    CSomething d=b;//使用拷贝构造函数,创建了一个新的对象d。

    CSomething *pA = c;//创建指针,指向对象c,没有构造新对象。

    CSomething *p = new CSomething(4);//新建一个对象。

    //综上,一共创建了6个对象。

     

    补充:注意区别:

    CSomething a();

    CSomething a;

    前者是一个函数的声明,与默认构造函数区分;//返回类型为CSomething,形参表为空

    后者是一个对象的定义;

    C++学习(16)

    C++学习(17)

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    通过Form添加数据到数据库里
    如何取消服务器/主机空间目录脚本的执行权限
    一个人的网站开发
    3.1.2 新版视频教程震撼发布(30集)
    P类问题,NP,NPC,HPHard,coNP,NPI问题 的简单认识
    随机算法与近似算法
    python to exe
    ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
    anaconda + pyqt5 + pycharm 安装,测试
    C++ 结构体初始化
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7472395.html
Copyright © 2011-2022 走看看