1.面向对象的重要特征:
封装性、继承性和多态性。
2.C++中的重点和难点:
2.1
构造函数和析构函数
构造函数负责完成类环境和类属性的初始化工作
析构函数,释放堆上分配的内存和其他资源
注意点: 两者都是由程序隐式调用,用户不能调用。
两者都没有返回值,且不能被继承
析构函数可以是虚的,但构造函数不能
在构造函数中最好不要做赋初值以外的事
析构函数在对象释放(delete)时被调用,它不含参数。
引申:
运算符new分配堆内存,如果成功,则返回指向该内存空间,如果失败,则返回NULL。所以每次使用运算符new动态分配内存时,都应测试new的返回指针值,以防分配失败。
堆空间大小是有限的,使操作系统和编译的设置不同而不同,当程序不在使用所分配的堆空间时,应及时用delete释放它们。程序中new和delete的数目要相等。
delete的操作数是new返回的指针,当返回的是new返回的数组时,应该带[]。
堆内存允许在运行时(而不是编译时)申请某个大小的内存空间。
构造函数负责完成类环境和类属性的初始化工作
析构函数,释放堆上分配的内存和其他资源
注意点: 两者都是由程序隐式调用,用户不能调用。
两者都没有返回值,且不能被继承
析构函数可以是虚的,但构造函数不能
在构造函数中最好不要做赋初值以外的事
析构函数在对象释放(delete)时被调用,它不含参数。
引申:
运算符new分配堆内存,如果成功,则返回指向该内存空间,如果失败,则返回NULL。所以每次使用运算符new动态分配内存时,都应测试new的返回指针值,以防分配失败。
堆空间大小是有限的,使操作系统和编译的设置不同而不同,当程序不在使用所分配的堆空间时,应及时用delete释放它们。程序中new和delete的数目要相等。
delete的操作数是new返回的指针,当返回的是new返回的数组时,应该带[]。
堆内存允许在运行时(而不是编译时)申请某个大小的内存空间。
2.2
指针
建立指针:定义指针和赋值
用&操作符可以获取变量的地址,指针变量用于存放地址。
int* iptr;
int iCount = 18;
iPtr = &iCount;
如果iCount地址是0000:F822,则iPtr的值是0000:F822。
用&操作符可以获取变量的地址,指针变量用于存放地址。
int* iptr;
int iCount = 18;
iPtr = &iCount;
如果iCount地址是0000:F822,则iPtr的值是0000:F822。
间接引用指针:
可获得由该指针指向的变量内容,如上面的*iPtr结果为18。间接引用指针既可用于右值也可用于左值,如*iPtr = 58;就是改变了iCount的值为58
指针也是变量,是变量就具有内存地址,所以指针也有地址:&iPtr。
指针在使用中必须类型匹配,*iPtr=&iCount; //error,指针值不是整型数
int *iPtr= &iCount;是正确的
指针在使用中必须类型匹配,*iPtr=&iCount; //error,指针值不是整型数
int *iPtr= &iCount;是正确的
指针运算,只有加法和减法适用于指针运算
int iArray[10];
int *iPtr = iArray;等价于int *iPtr = &iArray[0];都是指向数组第一个元素的地址。
指针运算都是以数据类型为单位展开,即iPtr是一个整型指针,iPtr++是指正指向下一个整型数,而iPtr的地址值实际增加了2。
int iArray[10];
int *iPtr = iArray;等价于int *iPtr = &iArray[0];都是指向数组第一个元素的地址。
指针运算都是以数据类型为单位展开,即iPtr是一个整型指针,iPtr++是指正指向下一个整型数,而iPtr的地址值实际增加了2。
指针与数组。
数组名本身是一个指针,使指针常量,区别于指针变量,不能赋值给它,不能做左值。
int a[100];int *iPtr = a;
第i个元素
a[i]等价于*(a+i)等价于iPtr[i]等价于*(iPtr+i)
第i个元素的地址
&a[i]等价于a+i等价于iPtr+i等价于&iPtr[i]
int a[100];int *iPtr = a;
第i个元素
a[i]等价于*(a+i)等价于iPtr[i]等价于*(iPtr+i)
第i个元素的地址
&a[i]等价于a+i等价于iPtr+i等价于&iPtr[i]
const指针
1.指向常量的指针(常量指针)
在指针定义语句的>>>类型<<<前加const,表示指向的对象是常量。*iPtr不能变
2.指针常量
在指针定义语句的>>>指针名<<<前加const,表示指针本身是常量,在定义指针常量时必须初始化。iPtr不能变。
3.指向常量的指针常量(常量指针常量)
定义是须初始化,const int * const cpc = &b;表示cpc和*cpc都是常量不能做为左值。
1.指向常量的指针(常量指针)
在指针定义语句的>>>类型<<<前加const,表示指向的对象是常量。*iPtr不能变
2.指针常量
在指针定义语句的>>>指针名<<<前加const,表示指针本身是常量,在定义指针常量时必须初始化。iPtr不能变。
3.指向常量的指针常量(常量指针常量)
定义是须初始化,const int * const cpc = &b;表示cpc和*cpc都是常量不能做为左值。
指针和函数
传递指针的函数调用过程为:
1.函数声明中指明指针参数如:void swap(int *x, int *y);
2.函数调用中传递以变量的地址,如swap(&a,&b);
3.函数定义中对形参进行间接访问。
返回指针的函数叫指针函数,指针函数把其中的局部变量地址返回是不妥的,可以返回堆地址,全局或静态变量的地址。
传递指针的函数调用过程为:
1.函数声明中指明指针参数如:void swap(int *x, int *y);
2.函数调用中传递以变量的地址,如swap(&a,&b);
3.函数定义中对形参进行间接访问。
返回指针的函数叫指针函数,指针函数把其中的局部变量地址返回是不妥的,可以返回堆地址,全局或静态变量的地址。
指向函数的指针
一个函数在编译时被分配一个入口地址,这个入口地址成为函数指针,可以用一个指针变量来指向该函数指针,然后通过该变量来调用函数。
函数指针的格式: 函数返回值数据类型标识符(*指针变量名)();
函数指针的加减是没有意义的。
一个函数在编译时被分配一个入口地址,这个入口地址成为函数指针,可以用一个指针变量来指向该函数指针,然后通过该变量来调用函数。
函数指针的格式: 函数返回值数据类型标识符(*指针变量名)();
函数指针的加减是没有意义的。
void类型指针
它能够被显式转换成其他任何类型的指针,其他任何类型的指针可以赋给void指针。空指针不能进行指针运算,也不能进行间接引用。
它能够被显式转换成其他任何类型的指针,其他任何类型的指针可以赋给void指针。空指针不能进行指针运算,也不能进行间接引用。
this指针
this指针涉及到编译问题。
this指针涉及到编译问题。
字符串常量
,由" "标示,但不是用来初始化数组的字符串,是字符串常量,其类型是指向字符的指针(char *)。
转载于:https://blog.51cto.com/phenix/102674