黑马程序员C语言教程:C++语言78个常见编译错误及分析
黑马程序员C语言教程:C++语言78个常见编译错误及分析 篇1
C++易犯错知识点(一)
1、赋值构成一个表达式,具有值,其值为赋值符左边表达式的值。表达式和语句的一个重要区别是,表达式有值,而语句没有值。
2、隐式类型转换总是朝着表达数据能力更强的方向,并且转换总是逐个运算符进行的。如 float f=3.5;int n=6;long k=21;double ss=f*n+k/2;//在计算ss时,首先将f和n转换成double,算得21,然后计算k/2得10,再将10(long int)转换成double,最后得31。
27、C++基础笔记(一)墨涵天地 有符号数向无符号数转换。
3、当又有声明又有定义时,定义中不允许出现默认参数,如果函数只有定义,才允许默认参数出现在定义中。默认值可以是一个全局变量,全局常量,或是一个函数,但是不能是局部变量,因为默认参数的函数调用是在编译时确定的,而局部变量的位置和值在编译时是无法确定的。如 int a=1;void fun(){ int i;void g(int x=i);//not right int g(int x=a);//right
}
4、define宏定义指令
1)使用其定义常量已被C++中的const定义语句所代替。2)用来定义带参数的宏,已被C++的内联函数所代替。3)其一个有效的使用是在条件编译中。
5、编译时必须知道数组的大小。如
int a[]={1,2,3,4,5};//编译器会自动去数 for(int i=0;i 7、Free和malloc int* a;a=(int*)malloc(sizeof(int));cout< 8、指向常量的指针,指针常量,指向常量的指针常量 指向常量的指针:通过指针不能改变所指向的变量的值,但是指针的值可以变化(即指针可 以指向其它变量的地址)。形式如const int* pi=&a;原来的变量的访问属性也不会发生改变,如原来是普通变量,则其值可以变化,原来是常变量,则其值不能变化。 指针常量:在定义时必须初始化,且一旦赋值,则以后该指针的值将不会再发生变化(即不能再指向其它地址)。形如char* const pc=“abcd”;注意,pc的值是不能再改变了,但是*pc的值可以变化,如*pc=b;指向常量的指针常量:具有上述两具指针的特点,须在定义时初始化,且一旦赋值,则以后该指针的值将不会再发生变化,且通过指针不能改变所指向的变量的值,形如const int* const cpc=“perfect”;注意,这种情况下,*cpc的值也是不能改变的,如*cpc=n是不对的。int main(){ char* const pc=“abcd”;cout< } 9、sum(int array[],int n)与sum(int* array,int n)是等价的。 10、函数返回值,可以返回堆地址,也可以返回全局或静态变量的地址,但是不能返回局部变量的地址。 11、void指针是空类型指针,它不指任何类型,它仅仅是一个地址,不能进行指针运算,也不能进行间接引用。 NULL与void* 是不同的概念,NULL是一个指针值,任何类型的指针都可赋予该值。而void* 是一种类型(语法上是一个类型,本质上不是,没有任何一个变量或对象,其类型为void),是一种无任何类型的指针。不允许对void进行引用。 12、由引号(“ ”)标识,但不是用来初始化数组的字符串,是字符串常量,如cout<<“hello”< 由于字符串常量的地址属性,两个同样字符组成的字符串常量是不相等的,字符串常量的比较是地址的比较。 字符串常量,字符数组名(常量指针),字符指针均属于同一种数据类型。 13、不能建立引用的数组,因为数组是某个数据类型的集合,数组名表示起始地址,它不是数据类型。如 int a[10];int& a1[10]=a;//not right 引用本身不是一种数据类型(int&不是类型,定义时也不产生内存空间),所以没有引用的引用。也没有引用的指针。引用是变量或对象的引用,而不是类型的引用,所以有空指针,但是没有空引用。Int& ri=NULL //没有意义 可以用引用返回值。在通常情况下,C++会建立一个临时变量以将函数返回值带回。但是如果用引用,则不用建立临时变量。 C++规定,临时变量或对象的生命周期在一个完整的语句表达式结束后便宣告结束。所以如果以返回值初始化一个引用,应当先建立一个变量,将函数返回值赋于这个变量,作如下处理: int x=fn1(5.0);//在这一句后临时变量生命周期将结束 int& b=x;************************* float temp; float& fn2(float r){ temp=10*r;return temp;} 用如上的方法,则函数返回值将不再创建临时变量,而直接与全局变量temp共享内存单元 ******************************* 以引用的初始化,可以是变量,也以是常量,也可以是一定类型的堆空间变量,但是引用不是指针,如下表达是不对的: int& a=new int(2); //not right 下面是用堆空间变量初始化引用的一个例子: #include //...{ cin>>rd; cout< cout<<&rd; } delete& rd;//或delete pd return 1;} 注意:用double& rd来定义引用,而&rd则是取引用所指向的空间的地址。 14、声明一个结构并不分配内存,内存分配发生在定义这个新数据类型的变量中。结构不像数组,结构变量不是指针,&结构变量 取到的是结构中第一个成员变量的地址。结构变量可以相互赋值。结构成员不能作自身的结构变量,但是可以用结构指针作为成员。 15、将类定义和其它成员函数定义分开,是目前开发程序的通常做法。我们把类定义(头文件)看成是类的外部接口,类的成员函数定义看成是类的内部实现。 类是一个抽象的概念,并不是一个实体,并不含有属性值,而只有对象才占有一定的空间,含有明确的属性值。 【黑马程序员C语言教程:C++语言78个常见编译错误及分析】推荐阅读: 黑马程序员PHP培训教程:同步和异步介绍05-29 黑马程序员济南中心PHP第11天教程11-12 黑马程序员面试题精编06-01 黑马程序员基础测试题08-27 黑马程序员:AJAX入门系列10-17 【黑马程序员】Java之debug总结三09-22 C++语言程序设计05-16 【黑马程序员】为什么面试官喜欢问职业规划05-19 C语言程序06-30