c++ 类与对象 疑难知识点总结(包含引用 new 重载)

大一下学期疑难知识总结目录:点击打开链接


7.

C++也支持面向过程的程序设计,不是一个纯正的面向对象的语言

8.

面向对象:程序 = 对象 + 消息

面向过程:程序=过程+调用

9.

分类所依据的原则——抽象。

类和对象之间的关系是抽象和具体的关系。

10.

类的成员可以是其他类的对象,但不能以类自身的对象作为本类的成员。

11. 直接在类中实现的成员函数自动成为内联函数。(不需要特殊的说明)

12. inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。

   void Fun(int x, int y);

inline voidFun(int x, int y) {…} // inline与函数定义体放在一起

13. 当&a的前面有类型符时(如int&a),它必然是对引用的声明;如果前面无类型符(如cout<<&a),则是取变量的地址。

14. 不能通过常引用对目标变量的值进行修改,这一特性在使用引用作为函数形参时有用,因为有时希望保护形参的值不被改变。

15. 不能建立数组的引用,但可以建立数组元素的引用

16. 不能用void声明引用

17. 引用必须初始化,而一旦被初始化后不得再作为其它变量的别名。指针可以被重新赋值以指向另一个不同的对象。

18. 不存在指向空值的引用,指针则可以是NULL。

19.可以建立指针变量的引用,不能建立引用的引用

20. int i=5;

int *p=&i;

int *&pt=p;//pt是一个指向整型变量的指针变量的引用,初始化为p

1.      引用作为形参,实参是变量而不是地址,这与指针变量作形参不一样。

2.      引用类型作为函数返回值时,注意不要返回对该函数内的自动变量(局部变量)的引用。

3.      由于自动变量的生存期仅局限于函数内部,当函数返回时,自动变量就消失了,上述函数返回一个无效的引用。一般这个变量是全局变量或静态局部变量,即存储在静态区中的变量。

4.      同类型的对象之间可以整体赋值,这种赋值与对象的成员的访问权限无关。

5.      当进行"string"变量和字符串字面值混合连接操作时,“+”操作符的左右操作数必须至少有一个是"string"类型的.

6.      String基本操作函数

a) string s;      //生成一个空字符串s

b) string s(str) //拷贝构造函数 生成str的复制品

c) string s(str,stridx) //将字符串str内"始于位置stridx"的部分当作字符串的初值

d) string s(str,stridx,strlen) //将字符串str内"始于stridx且长度顶多strlen"的部分作为字符串的初值

e) string s(cstr) //将C字符串作为s的初值

f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。

g) string s(num,c) //生成一个字符串,包含num个c字符

h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值

7.公有成员赋初值(如果都是公有成员)

 class Date

{public:

        intd, m, y;

}

  Date today = {11,11,2011};     // 将today初始化为d:11,m:11,y:2011

8.析构函数没有返回值,不能有参数,不指定函数类型

9.实参与形参的结合是从左至右顺序进行的。因此指定默认值的参数必须放在形参表列中的最右端,否则出错。

10. 一个函数不能既作为重载函数,又作为有默认参数的函数

11. 在函数调用时,若某个实参省略,则其后的参数皆应省略而采用缺省值。不允许某个参数省略后,再给其后的参数指定参数值.

12.

如果程序中既有函数的声明又有函数的定义时,默认参数在函数声明中提供。定义函数时不允许再定义参数的默认值。

例子:

void fun(int x = 0,int y = 0);

void main(){}

void fun(int x = 0, int y = 0){ } // error

13.

函数可以重新说明使原来不带缺省值的参数带上缺省值,但已经指明缺省值的参数不能重新说明。

正确代码:

void initialize(int printNo,int state=0)

void initialize(int printNo=1,int state)

错误代码:

void initialize(int printNo,int state=0)

void initialize(int printNo,int state=1)

14.

在类中,没有参数的构造函数,或各参数均有缺省值的构造函数都称为默认的构造函数,一个类中,默认的构造函数只能有一个。

15.

new开辟的内存单元,在此期间,指针不能重新赋值,用new开辟的空间只能用delete显式地释放。

16. 内存的动态分配是否成功进行检查

 if(!p)

   {cout<<“allocation failure”<<endl;

            return 1; }

17.

在撤消对象时,系统自动收回为对象所分配的存储空间,而不能自动收回由new分配的动态存储空间。

18.

以下三种情况下由编译系统自动调用复制构造函数:

a)        声明语句中用类的一个已知对象初始化该类的另一个对象时。

b)        当对象作为一个函数实参传递给函数的形参时,需要将实参对象去初始化形参对象时,需要调用复制构造函数。

c)        当对象是函数的返回值时,由于需要生成一个临时对象作为函数返回结果,系统需要将一个对象的值初始化临时对象,需要调用复制构造函数。

19

c3=c2;             //此时为赋值操作,不会调用复制构造函数

Complex c3= c1;  // 调用复制构造函数Complex(Complex & c),兼容c的风格

18.

用指向对象的指针来访问对象成员时,要用“->”操作符.

19.

“指向类成员的指针”这样的描述中有“指针”一词,其实它并不是真正的指针,因为它既不包含地址,行为也不像指针。

1)        与常规指针不同,一个指向类成员的指针并不指向一个具体的内存位置,它是指向类的特定成员,而不是指向某个类特定对象里的特定成员。

2)        其值为数据成员在类内的偏移量(offset)(注:只能用printf()才能输出正确的偏移量,用cout输出均为1)

20.

  int (Coord::*pc_getx)(); //声明成员函数指针pc_getx    ①

  pc_getx=Coord::getx;   //给成员函数指针pc_getx赋值 ②

21.

一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。

22.

sizeof 运算符不会计算静态数据成员

23.

1)        静态数据成员是在所有对象之外单独开辟空间,在声明对象时,并不为静态数据成员分配空间。

2)        静态数据成员不属于某一个对象。即使不定义对象,也为静态数据成员分配空间,也可以通过类名直接引用它。

24.

类的静态数据成员是静态分配存储空间的,而其它成员是动态分配存储空间的(全局变量除外),当类中没有定义静态数据成员时,在程序执行期间遇到声明类的对象时,才为对象的所有成员依次分配存储空间,这种存储空间的分配是动态的;而当类中定义了静态数据成员时,在编译时,就要为类的静态数据成员分配存储空间。

25.

在C++中,静态数据成员缺省的初值为0,所以静态数据成员总有唯一的初值。

26.

静态成员函数仅可以直接访问同一类的静态成员(静态成员函数或是静态数据成员)以及全局变量

27.

静态成员函数与非静态成员函数的根本区别:非静态成员函数有this指针,静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。

28.

一定要先定义类,再定义友元函数,否则编译报错

29.

对象成员初始化的顺序与对象成员的在类中声明的顺序有关,与在初始化列表中的顺序无关

30.

常对象必须在定义时有初值

31

使用常对象时应该注意的问题

C++规定常对象只能调用它的常成员函数、静态成员函数(除了由系统自动调用的构造函数和析构函数)。

常对象能调用其数据成员,但不能修改数据成员的值。

32.

如果在一个类中说明了常数据成员,那么构造函数就只能通过初始化列表对常数据成员进行初始化,而任何其他函数都不能对该成员赋值

33.

只有常成员函数才能操作常量或常对象,常成员函数不能调用非const修饰的成员函数(静态成员函数除外)即只能调用常成员函数和静态成员函数。

非const成员函数不能用来操作常对象。

34.

猜你喜欢

转载自blog.csdn.net/sdz20172133/article/details/80863229