C++一些知识点的简单总结

本文简单总结一些在博客中没有写到的C++基础内容,方便日后查看。

欢迎大家补充(持续更新)


声明与定义:

变量的声明同时也是定义。只有extern int a这种情况下是声明。

函数才分声明(原型)和定义(实现)。


作用域:

1,局部

2,全局

3,命名空间

4,类


访问命名空间中的成员

比如命名空间N1中有Fun()函数

1,N1::Fun();

2,using namespace N1;

3,using namespace N1::Fun();


内存分配(地址由高到低)

1. 栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。

2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共

享共享内存,做进程间通信。

3. 堆用于程序运行时动态内存分配,堆是可以上增长的。

4. 数据段--存储全局数据和静态数据。

5. 代码段--可执行的代码/只读常量。


typedef关键字(类型别名)

数组:typedef int ARRY_INT[10];

函数指针:typedef void (*Fun)(int a);


引用(实体别名)

数组引用:int a[10] = {0};int (&ra)[10]  = a;


参数与返回值

1,参数:

三种传递方式:传值、传指针、传引用。

根据功能还可分为:

(1)输入型参数:不会改变传入实参的内容(传值,带const的传指针,带const的传引用)。

(2)输出型参数:会.改变传入实参的内容(不带const的传指针,不带const的传引用)。

2,返回值:

(1)无返回值

(2)临时变量:返回一个用完就销毁的值。    

(3)引用(或指针):主要支持链式赋值的操作。

一般来说,对于


const

顶层const:任意对象都是常量。

底层const:指针或引用所指的对象是一个常量。

指针类型即可以是顶层cosnt,又可以是底层const。const int * const p = &a; 


空类大小

为了区分不同的类,使他们在内存中的偏移不同,编译器会在空类中自己添加一个char成本变量,使得空类大小变为1.


类的六大默认成员函数

1,构造函数

2,拷贝构造函数

3,析构函数

4,赋值运算符重载函数

5,取地址操作符重载函数

6,带const修饰的取地址操作符重载函数


构造函数特性

1,函数名与类名相同

2,没有返回值

3,有初始化列表(可以不用)

4,新对象被创建,由编译器自动调用,且在对象的生命周期内仅调用一次

5,构造函数可以重载,实参决定了调用哪个构造函数

6,如果没有显示定义时,编译器会提供一个默认的构造函数

7,无参构造函数和带有缺省值的构造函数都认为是缺省的构造函数

8,构造函数不能用const修饰(思考为什么?)


初始化列表

1,每个成员在初始化列表中只能出现一次(思考为什么?)

2,初始化列表仅用于初始化数据成员,并不指定这些数据成员的初始化顺序

(数据成员在类中定义顺序就是在参数列表中的初始化顺序)

3,尽量避免使用成员初始化成员,成员的初始化顺序最好和成员的定义顺序保持一致


类的哪些成员变量必须在初始化列表中初始化

1,引用数据成员

2,const数据成员。

3,类类型成员,且该类没有缺省的构造函数。

4,如果存在继承,则必须在初始化列表中调用基类构造函数


构造函数有没有返回值?

在语言层次,我们确实无法返回一个值。

但是在底层实现上,在构造函数调用后,函数给编译器返回了一个值。


析构函数特性

1,析构函数在类名前加上字符‘~’

2,析构函数无参无返回值

3,一个类有且只有一个析构函数,若无显示定义,系统会自动生成缺省的析构函数

4,对象声明周期结束时,编译器会自动调用析构函数

5,注意析构函数体内并不是删除对象,而是做一些清理工作


访问类中的私有成员变量

1,公有成员函数

2,类的友元函数

3,利用类的基地址偏移。


编译器如何辨认一个类

1,识别类名

2,识别类名成员变量

3,识别类名成员函数,并进行改写


继承三种方式(区别在于:派生类对基类的成员的可见性不同)

1,public

2,protected

3,private


按继承个数分为

1,单继承

2,多继承

3,虚继承(共享继承,基类的个数只有一个,其所有派生类指向同一个基类)


函数重载、重写、隐藏

重载满足:1,同一作用域。2,函数同名。3,参数列表不同(参数类型、个数、顺序)。4,有无virtual都可

重写满足:1,不同作用域(基类与派生类)。2,函数同名。3,参数列表相同。4,带有virtual修饰符

隐藏满足:1,不同作用域(基类与派生类)。2,函数名相同。3,①参数列表不同,有无virtual都可②参数列表相同,但不带有virtual修饰符。



offset(s, m)宏

((size_t) &((s *)0)->m)


inline

1,inline是一种以空间或时间的做法,省去调用函数额外开销。所以代码很长或者有循环、递归的函数不适合使用内敛

2,inline对编译器而言只是一个建议。编译器会自动优化。

3,inline必须和函数定义放在一起,仅将inline放在声明前是不起作用的。

4,定义在类内的成员函数默认定义为内敛函数



你可能感兴趣的:(C++知识点,C++,知识点总结)