码迷,mamicode.com
首页 > 编程语言 > 详细

32 C++常见错误集锦

时间:2017-09-04 10:54:48      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:struct   实例   创建对象   标识   消息队列   理解   round   补充   something   

 

 

下列程序中,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)

32 C++常见错误集锦

标签:struct   实例   创建对象   标识   消息队列   理解   round   补充   something   

原文地址:http://www.cnblogs.com/dd2hm/p/7472395.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!