类也可以写在命名空间内部。
C语言中的const修饰的变量可以用指针来修改,c++不行(类似于define的宏替换,宏替换在预处理阶段const在编译阶段)
C和C++中全局 const 变量的作用域相同,都是当前文件,不同的是它们的可见范围:C语言中 const 全局变量的可见范围是整个程序,在其他文件中使用 extern 声明后就可以使用;而C++中 const 全局变量的可见范围仅限于当前文件,在其他文件中不可见,所以它可以定义在头文件中,多次引入后也不会出错。
new和delete会自动调用构造和析构函数
内联函数,定义处加inline(可以在头文件中定义,普通函数不允许,尽量直接在头文件中定义)
函数的默认参数(在给定的作用域中,只允许指定一次默认参数,并在当前作用域使用当前默认参数)
函数重载返回值不能作为重载条件,其本质是根据函数名,形参列表,构成的不同函数`
函数重载,当不能精确匹配时发生类型转换,如出现二义性则报错。
类只是一个模板,并不会占用内存空间,只有在实体化以后才会分配内存。
成员函数在类中定义和类外定义的区别:
在类中定义的成员函数会自动成为内联函数,实际开发以类外定义为主
对象的内存模型
成员变量和成员函数分开存储,成员函数只会存储一份。同样存在内存对齐,按照成员对象的声明顺序。
成员函数最终会被编译成全局函数。如何访问成员对象?
在编译的时候会为成员函数添加一个参数,类指针。这样就可以通过指针来访问成员对象了。
本质不是通过对象去找函数而是通过函数去找对象。
构造函数必须是 public 属性的,否则创建对象时无法调用。
调用没有参数的构造函数也可以省略括号。
对于const类型的成员变量必须使用初始化列表进行初始化。
成员对象,先构造后析构。
this指针:
本质是成员函数的一个形参,在调用成员函数的时候,将对象的地址作为实参传递给this(this和对象的地址是一样的)
静态成员变量(static),必须在类声明的外部初始化,初始化时不用加static,但要有数据类型和类名。和普通的静态变量一样在全局数据区开辟空间(所有其不会占用对象的内存,即使不创建对象也可以访问),只能被初始化一次,必须初始化(静态变量可以不,默认为0)。
既可以用对象来访问也可以用类来访问。(和普通的成员变量一样,外部只能访问public)
静态成员函数(只能访问静态成员,类似于普通的全局函数,不会为其添加this指针)
const成员函数,在声明和定义的时候在 函数的尾部加上const(禁止函数修改数据)
const修饰对象(常对象),只能调用const成员变量和const成员函数。
友元函数
- 将非成员函数声明为友元函数。不会添加this指针,参数需是对象或对象指针。
- 将其他类的成员函数声明为友元函数
友元类:可以访问其友元的全部成员,包括成员函数和成员变量。friend写入被访问类的内部(类自己记录可以访问他的朋友)
class和stuct区别:
1.class默认是private struct默认是public
2.classl可以包含函数 struct也可以(c语言中不行)
3.class可以使用模板
引用,从一而终,别名。本质,指针,系统帮我们解引用。
函数的返回值如果是引用,注意不能反回局部数据(临时数据)。
什么样的临时数据会放到寄存器中?
较小的临时数据如:int double bool char 一般不会超过8个字节。
而对象,结构体这些临时数据的大小不可预测,一般会存放到内存中。
编译会为const引用创建临时变量。
编译器会为临时数据创建一个新的、无名的临时变量,并将临时数据放入该临时变量中,然后再将引用绑定到该临时变量。注意,临时变量也是变量,所有的变量都会被分配内存。
typedef struct{
int a;
int b;
} S;
int func_int(){
int n = 100;
return n;
}
S func_s(){
S a;
a.a = 100;
a.b = 200;
return a;
}
S operator+(const S &A, const S &B){
S C;
C.a = A.a + B.a;
C.b = A.b + B.b;
return C;
}
int main(){
int m = 100, n = 36;
const int &r1 = m + n;
const int &r2 = m + 28;
const int &r3 = 12 * 3;
const int &r4 = 50;
const int &r5 = func_int();
S s1 = {23, 45};
S s2 = {90, 75};
const S &r6 = func_s();
const S &r7 = s1 + s2;
return 0;
}
临时变量本身就是不允许修改的,这恰好与const吻合。
const 引用与类型转换
给引用添加 const 限定后,不但可以将引用绑定到临时数据,还可以将引用绑定到类型相近的数据,
float f = 12.45;
const int &r = f;
printf("%d", r);
1.避免数据篡改
2.让const函数可以接受const和非const参数
3.可以使用临时变量。