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)

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    oracle的安装与plsql的环境配置
    Working with MSDTC
    soapui-java.lang.Exception Failed to load url
    Oracle 一个owner访问另一个owner的table,不加owner
    Call API relation to TLS 1.2
    Call API HTTP header Authorization: Basic
    VS2008 .csproj cannot be opened.The project type is not supported by this installat
    The changes couldn't be completed.Please reboot your computer and try again.
    Create DB Table View Procedure
    DB Change
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7472395.html
Copyright © 2011-2022 走看看