C/C++的知识打理一
作者:互联网
1、引用和指针的区别:
(1)指针是一个实体需要分配内存空间,而引用时一个别名不需要分配内存空间;
(2)指针定义的时候不一定初始化,并且指向的空间可变,引用需要初始化且不可变;
(3)有多级指针,并没有多级引用;
(4)其自增效果不一样(指针是指向下一个空间,而引用则是变量加1);
(5)sizeof()不同,sizeof 指针 是指针的大小,而sizeof引用是对象的大小;
(6)指针是间接访问,而引用是直接访问;
(7)传递参数不同;指针传递的是指针的地址(传值),引用传递的是地址;
(传值;可以拿这个值来运算,原来的还在;传地址将运算后的结果直接存入,原来的
就不在了);
2、指针参数传递和引用参数传递:
(1)指针参数传递 :值传递(地址值),形参指针变,实参不会变;
(2)引用参数传递:栈中开辟内存空间,形参操作会影响实参;
相同点:都是在栈上开辟空间。不同点:引用间接改变主函数相关变量。
3、形参和实参的区别:
(1)形参内存(调用时分配),调用结束后释放;
(2)函数调用中发生的数据传送是单项的,也就是只能从实参到形参传递;
(3)传递方式的分类:
(1)值传递:有一个形参向函数所属的栈拷贝数据的过程。
(2)指针传递:同样是这个过程,不过拷贝的是一份地址。
(3) 引用传递:对该数据的地址,起一个别名。
效率:指针传递和引用传递会比值传递的效率高;
4、static的用法和作用:
(1)隐藏:当编译多个文件时,没有加static的都具有全局可观性。
(2)保存变量内容持久,(存储在静态数据区)只进行一次初始化。
(3) 默认初始化为0;
(4)类成员声明:
(1)可以在模块内被访问,不能在模块外访问。
(2)所有对象共享这一内存;
(3)this 只能访问static的变量,不能访问到其函数。
(4)需要在类外进行初始化;
(5)static函数只能访问static成员;
(6)成员函数不能被虚函数修饰;
5、静态变量什么时候初始化:
(1)在主程序之前,在编译的时候,编译器已经为它分配空间。
6、const、mutable、extern
const对象只能调用const成员函数,不能调用非const函数;
int *const p1 或者 const int *p1(const 修饰的是*p1);
const 如果想在const 成员方法中改变成员变量的值,那么需要将这个成员变量修饰 为 mutable;
extern修饰变量声明:如果文件a要用文件b的变量就可以在a中声明extern,函数也是一样。
7、深拷贝和浅拷贝
(1)浅拷贝:仅仅只是指向被复制的内存的地址。
(2)深拷贝:在计算机中有开辟了一块新的内存地址。
总结:浅拷贝只是对,指针进行拷贝,而深拷贝不仅对指针而且对指针指向的内容进行 拷贝。浅拷贝(delete)释放两次会出错。
8、c++模板是什么的实现。
编译器会对模板编译两次,一次是在声明的地方进行编译,另一个则是在调用的地方进行编 译。
9、c语言struct和c++struct的区别
(1)C语言的struct是用户自定义数据类型,而C++是抽象数据类型(支持多态和继承);
(2)C中的struct是没有权限设置的,C++中struct默认是public(为了与c兼容);
10、类成员的初始化;
(1)赋值初始化,通过函数体内进行赋值初始化。
(2)列表初始化,在冒号后使用初始化。
区别:(1)所有成员分配内存之后才开始进行,(2)分配内存空间的时候就进行。
11、为什么初始化列表会快一些;
因为C++赋值操作时会产生临时对象的,临时对象对降低程序的执行效率;
12、必须使用成员初始化
(1)当初始化一个引用成员时,
(2)当初始化一个常量成员时,
(3)当调用一个基类的构造函数,它拥有一组参数,
(4)当调用一个成员类的构造函数,它拥有一组参数,
13、构造函数为什么不能用虚函数、而析构函数为什么要虚函数。
(1)从存储空间角度来讲,虚函数相应指向vtable虚函数表的指针,这个大家都知道,但时这 个指向vtable的指针事实上是存储在对象内存空间的,也就是构造函数实现的时候对象还实 例化,还没有一个内存空间。
(2)析构函数采用析构函数是为了防止内存泄漏;
标签:初始化,const,函数,知识,C++,引用,拷贝,打理,指针 来源: https://blog.csdn.net/hhhshs/article/details/120585511