友元函数是一种在类外定义,在类内特殊声明(加关键字friend),并且可以在类外访问类的所有成员的非成员函数。友元函数相对于普通函数,增加了访问类成员的权利。A、友元函数可以像普通函数一样直接调用,不需要通过对象或指针;BC、友元函数不是成员函数,所以不能被继承,也同样没有this指针;D、由于友元函数和普通函数的区别仅仅是具有访问类成员的权利,和继承性机制没有关系。友元函数破坏的是封装性。
求一个类的sizeof()
1 先找有没有virtual 有的话就要建立虚函数表,+4
2 static的成员变量属于类域,不算入对象中 +0
3 神马成员都没有的类,或者只有成员函数 +1
4 对齐法则,对大家都没有问题
const int a = 10; //编译可通过,和int const a = 10; 表达的效果是一样的
a = 20; //编译不通过
const int a; //编译不通过,必须初始化
//指针常量,指向不能修改,指向的内存中的值可以修改,相当于数组名;
int b = 100;
int *const p; //编译报错,必须初始化
int *const p = &b; //编译通过
int *const p = &a; //编译不通过,因为a是常量
//常量指针,指针指向可以修改,但指向的值不能修改,此时该指针也叫只读指针
int const *p; //编译能通过,只是p为野指针
int const *p = &a; //编译可通过
int const *p = &b; //编译可通过
*p = 200; //不管p指向a还是b,编译都不会通过
//常量指针常量
const int *const pp; //编译不通过,必须初始化
const int *const pp = &a; //编译通过
const int *const pp = &b; //编译通过,此时b可以改变值,而且pp指向的值同步改变,但不能通过pp修改b的值
普通成员函数后面加上 const 修饰,就是常函数。
常函数中的 this 指针是常指针,不能在常函数中对成员变量进行修改,只能读取;
如果想要在常函数中对成员变量进行修改,可以在成员变量前加上 mutable 关键字进行修饰;
常函数可以被普通对象或者常对象调用,但是常对象只能调用常函数,常对象只能读成员。
静态联编 :指在编译阶段就将函数实现和函数调用关联起来,也叫早绑定。
动态联编:在程序执行的时候才将函数实现和函数调用关联。因此也叫晚绑定,一般情况下都是静态联编,涉及到多态和虚拟函数就必须使用动态联编了。
int *p[4]; //表示指针数组,有四个元素,每个元素都是整型指针。
int (*p)[4]; //表示行指针,所指对象一行有四个元素。
int *p(void); //表示函数,此函数无参,返回整型指针。
int(*P)(void) ;//表示函数指针,可以指向无参,且返回值为整型指针的函数。
C/C++ 中二维数组可以省略行数,但不能省略列数,因为二维数组存储的时候是先行后列。如果不指定列数,系统就无法得知一行需要存放几个数值,只要知道了列数,排头放就可以知道一共能放多少行。