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.命名空间

命名空间就是定义一个新的作用域,里面可以放函数,变量,类等,防止命名冲突的一个作用。

代码实现就是:

cpp 复制代码
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这个命名空间来进行实例化,指定不同的命名空间实例化出来的对象就本同。

相关推荐
子沫20203 小时前
springboot中server.main.web-application-type=reactive导致的拦截器不生效
java·spring boot·后端
兮兮能吃能睡3 小时前
R语言术语(2)
开发语言·r语言
Pluchon3 小时前
硅基计划4.0 算法 二叉树深搜(DFS)
java·数据结构·算法·leetcode·深度优先·剪枝
whm27774 小时前
Visual Basic 参数传送-形参与实参
开发语言·visual studio
9号达人4 小时前
if-else 优化的折中思考:不是消灭分支,而是控制风险
java·后端·面试
共享家95274 小时前
QT-常用控件(多元素控件)
开发语言·前端·qt
幸运小圣4 小时前
Iterator迭代器 【ES6】
开发语言·javascript·es6
葱头的故事4 小时前
将传给后端的数据转换为以formData的类型传递
开发语言·前端·javascript
中微子4 小时前
🚀 2025前端面试必考:手把手教你搞定自定义右键菜单,告别复制失败的尴尬
javascript·面试