C++复习(1)
目录
1.总策略
2.知识问题总结
1.命名空间
1.命名空间
1.总策略
复习的话是先看一遍所有的知识,把问题写下来,看到不会的进行标记
2.知识问题总结
1.命名空间
命名空间的代码实现,命名空间的用处(主要用来定义一个新的作用域,延伸记忆,using namespoce std;这个代码)
嵌套命名空间,同一工程允许有相同的命名空间,编译器最后会进行合并
usingnamespace可以把这个命名空间展开,但是作用域有相同的变量会出现冲突。
2.缺省参数
缺省参数就是定义一个函数的时候,可以把它的参数进行赋值,如果你调这个函数没有传参数,就用默认的,如果传了就用你传的,全缺省就是所有的参数都给一个默认值,半缺省就是有的值有默认值有的参数没有默认值,如果是半缺省,参数必须从右到左依次给出。
下面这种给法就会报错。
缺省函数不能声明在声明和定义的时候同时给出,因为如果你们缺省参数给的不一样,不知道你到底是怎么回事,编译器会糊涂。C语言不支持缺省。
3.深拷贝和浅拷贝
这里又想起了深拷贝浅拷贝,提一下,你一个类的实例对象进行创建可以拷贝另一个已经实例的,这个时候如果类里面有指针,你如果是浅拷贝,出作用域会对指针对应的变量进行销毁,如果是浅拷贝, 它们指向同一个空间,会出现重复释放,报错,所以深拷贝就是对于指针变量的值,进行重新开辟一个空间,而不是去直接拿已经实例化对象的指针值(面试这道题没答出来,真是印象深刻)
4.函数重载
条件是:相同作用域,函数名相同,参数不同就会实现函数重载参数不同体现在个数,顺序,类型不同,只要能区分你是两个不同的函数参数就可以。
函数重载就是相同的函数名实现不同的定义。
调用原理,编译期间会进行推导,找到对应的调用函数,进行调用,所以要保证不能存在二义性。
什么是函数重载?
函数重载的确认是在编译期间还是运行期间
C语言支持吗?为什么?(为什么的问题要知道C语言对于函数名在编译时的修改仅仅是函数名前加_)
C++底层如何支持函数重载,博主也不太知道,看了一下答案,发现给出的解释是,C++在进行编译函数名的改变是会把它的参数加到函数名中,这样参数不同它们的名字也就不同,就可以对函数重载不同的实现进行区分,总结一下,说人话就是因为函数重载要求参数不同,所以C++支持函数重载就是把参数名跟函数名进行混合,就能区分了。
如果仅仅返回值不同构成函数重载吗?当然不能,举个例子,ADD(1,2)参数相同,它如何知道是调用哪个函数呢?是返回double呢?还是返回Int呢?举反例进行证明
extern “C”告诉编译器这个函数用C的方式来编译
5.引用
这个常和指针一起考察。
引用说人话就是给一个变量起一个别名,它们共享一块空间,任意一个的改变都会互相影响。
特性:int&a=b引用定义时初始化,一旦初始化不能修改,一个变量可以有多个引用,这个可以理解
有个人叫张三,别人叫他法外狂徒,小三,都可以,但是都是一个人,张三某一天进去了,小三也进去了。
const引用,该引用变量值不能修改,但是仅仅是不能通过这个引用修改罢了,const不能隔山打牛,将这个地址对应变量的区域设置为不可修改。
这个打印出来就是10
引用这个东西不可以返回即将被销毁的局部变量,容易出现悬空引用。
引用的应用场景和注意事项,可以做函数参数,如果你想函数里面对这个变量进行修改,可以传引用过去。
底层实现,看的时候也是比较惊讶但又还好,引用的底层就是指针,也可以理解,比如你引用就是多个变量名共享一个空间,指针也是一样的。
只不过是T* const ==T&,豁然开朗,终于知道为什么引用必须开始的时候必须初始化了,因为它加const了。这里又可以明白为什么它的指针不可以被修改但是值可以被修改,看下面
int a =5;int &b=a就是 int*const b=&a;可以理解了吗?const在*的右边,这个意思就是指针的指向不可以修改,但是可以修改里面的值,引用加const就是在*的左边也加const,这样就是指针指向和指向的值都不可以被修改了。
6.inline
inline就是一种建议,对于一些函数体小的代码直接编译时展开,减少函数压栈出栈的开销。inline不要声明和定义分离,一旦展开函数就没有地址了,链接会报错。
7.面向对象和面向过程的区别
理解:一句话,面向对象关心的是谁来做,它把数据和函数封装在一起,把接口暴露出来,让一个一个的对象去处理对应的工作,代码的耦合性低。
面向过程就是怎么做,是线性的,自上而下的。
8.类
类:把数据和方法放在一起的一个方法。
类可以把声明和定义放在一起,也可以把声明在.h文件进行,.cc进行定义,定义的时候需要指定类::
类的封装特性:
访问限定符,private,protected,public
概念就是把数据和方法进行封装,数据一般设为private,只暴露接口供外部进行使用,外部不可以随意更改类的数据。
面向对象的三大特性,封装继承多态,什么是封装,如何实现封装。
类的作用域,在类外进行初始化的时候需要加::指明是哪个类的变量,比如常见的static。
类中的private成员变量可以在任意的成员函数使用。
类和对象的区别,实例化,如何计算一个类的大小,空类的大小,为什么?内存对齐,如何知道结构体某个成员相对于结构体起始位置的偏移量。
测试机器的大小端。这个还真不咋会,现场学习一下,小端是低位存在低地址,大端是低位存在高地址,想一下,如何确定,应该是根据指针的第一个强转来实现。
写一段代码可以来验证一下,int a=1;char *p=(char*)&a;cout<<(int)*p;,拿到地址对应的第一个地址
this指针,概念,为什么要有,存在哪里(栈上),可以是NULL吗?this指针是为了区分不同对象,一个类实例化出多个对象,你要知道具体是哪个对象进行调用,所以需要This,它可以是空的,但是当为空的时候说明没有实际的对象,如果空THIS对成员变量进行操作会直接报错。
3.命名空间
命名空间就是定义一个新的作用域,里面可以放函数,变量,类等,防止命名冲突的一个作用。
代码实现就是:
namespace wzb
{class A{public:A(){cout << "wzb";}};
}
namespace wzb2
{class A{public:A(){cout << "wzb2";}};
}
int main()
{wzb::A a;wzb2::A b;return 0;
}
在上面的代码里面,A这个类的实例化需要指定wzb这个命名空间来进行实例化,指定不同的命名空间实例化出来的对象就本同。