一、c++对C语言的增强:
1.全局变量检测增强。
2.函数检测增强:参数类型、返回值、函数调用参数检测增强。
3.类型转换检测增强:c++中malloc空间时需要强转一下类型。
malloc的返回值是char*
4.struct增强:C语言中结构体中不可以加函数,C++可以;
C语言中使用结构体类型定义变量时必须要加struct关键字(或者改名), C++中可以不用加关键字。
5.bool类型增强:C语言中没有bool类型,C++中有(大小为1)。
6.三目运算符增强:
如:(a>b?a:b)=100;//a=10;b=20;
在C语言中,三目运算式->(a>b?a:b)这整个式子,返回的是值,即20;而C++中返回的是变量,也就是这个式子最终得到的变量,即变量b。如果C语言想模仿C++写,就得改成这样:a>b?&a:&b=100;
7.const增强:C语言中它修饰的变量是伪常量,编译器是会分配内存的;C++中不会分配内存,下边的结构是有一个符号表:键值和幅值。
在C++中: 编译器会临时开辟一块内存空间。
int * p=(int *)&b;
=》int tmp=b;//tmp就是那块临时内存
int *p=(int *)tmp;
在这就保证了真正意义上的const。
注意:const只要实在的分配了内存就可以用指针更改它的值。
自定义变量被const修饰后实在的分配了内存,也可以用指针改变值。
8.引用:本质在C++内部实现是一个指针常量
1.不合法的写法
int &r=10;//引用了不合法的内存,不可以
2.合法写法
const int &r=10;//加入const后,会分配内存,也就是tmp,编译器的处理方式为:int tmp=10;const int &r=tmp;这就有了实际内存,所以是可以引用的
c++中的const默认是内部连接,外部访问不到:(C语言中可以这样被外部访问)
a.const int a=0;//这条语句定义的a在其他文件中无法调用
b.extern const int a=0;//extern提高了作用域,可以外部访问了
二、类
1.内联函数
a.在普通函数(非成员函数)前面加上inline关键字使之成为内联函数。但是必须注意函数体和声明结合在一起,否则编译器会将没有添加inline关键字的函数实现(函数体)当做普通函数。
仅仅是声明,没有实现的话是没用的;声明和实现分开,且实现部分没有加上inline关键字也是无效的。如:
inline void add(int a,int b);
void add(int a,int b)
{
a=a+b;
}
以上实现的函数是没用的,声明的函数和函数体无关。
内联函数的确占空间,但是它相对于普通函数的优势只是省去了函数调用时的压栈,跳转,返回的开销。可以理解为以空间换时间。
在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。显然,这种做法不会产生转去转回的问题,但是由于在编译时将函数休中的代码被替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间代销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。在程序中,调用其函数时,该函数在编译时被替代,而不是像一般函数那样是在运行时被调用。
2.C语言封装的缺点:
a.属性和行为分开处理了;b.参数类型检测不够严格。
三、成员函数
1.构造函数调用方式:
a.括号法 person p;//默认构造函数,不加括号;加括号的会被认为是函数的声明。
b.显示法 person p=person(100);//其中的person(100)叫匿名对象,如果编译器发现了对象是匿名对象,那么在这行代码结束后就释放这个对象。
2.不能用拷贝构造函数去初始化匿名对象
注意
1,静态成员函数中能访问非静态成员(包括属性和函数)吗?
不能直接访问。
因为所以对非静态成员的访问都是通过this指针,而静态成员函数中没有this
2,静态成员函数中能访问静态成员(包括属性和函数)吗?
可以
静态成员属于类,不属于对象,不需要通过 对象去访问
3,静态成员函数可以是常函数吗??
不可以
常函数的 const是限定 *this 的 (不能通过 this去修改它指向的对象),
但是静态成员函数中没有this
和静态成员变量一样,也可以通过类名去访问静态成员函数
对象名.函数名(参数);
或者
类名::函数名(参数);