C++复习:引用和指针的区别 inline内联函数 函数重载 this指针 explicit static

1.c++引用与c指针的区别
语法概念层面:引用变量只是别名,没有实际空间,与其实体共用同一块内存(有区别)
底层实现上:引用就是指针,引用实际上是有空间-----------地址(无区别)
1.引用在定义时必须初始化,指针没有要求。
2.引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体。
3.在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
4.有多级指针,但是没有多级引用。
2. inline内联函数
我们先看看c语言中的宏函数

#define ADD(a,b)((a)+(b))   // 只是一个宏函数
int main()
{
	int x = 2;
	int y = x * 3;
	int ret = ADD(x, y);
	cout << ret << endl;
	system("pause");
	return 0;
}

宏的注意事项:
1.宏函数定义时要特别注意格式,尤其是括号,能加的时候就尽量加上,否则容易出现优先级错误。
2.宏函数的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心。
3.宏函数往往会导致较低的代码执行效率,甚至导致预料外的结果。
宏的优点
1.没有函数压栈的开销,效率高;
2.增强了代码的复用性;

内联函数和宏的区别
1.内联函数在编译时展开,可以做一些类型检测处理。宏在预编译时展开;内联函数直接嵌入到目标代码中,宏是简单的做文本替换。

2.C++中引入了类及类的访问控制,在涉及到类的保护成员和私有成员就不能用宏定义来操作。

内联函数:
内联函数的概念:
以inline修饰的函数叫做内联函数。编译时C+ +编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升了程序运行的效率。
在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。

inline int ADD(int left, int right)
{
	return left + right;
}
int main()
{
	int x = 2;
	int y = x * 3;
	int ret = ADD(x, y);
	cout << ret << endl;
	system("pause");
	return 0;
}

inline是一种以空间换取时间的做法,它省去了调用函数的额外开销。所以代码很长或者有循环/递归的函数不适宜使用内联函数;

inline不建议声明和定义分离,分离会导致链接错误。因为内联函数在编译时C+ +编译器会在调用内联函数的地方展开,展开之后就没有函数地址了,链接就找不到

3.函数重载
函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。

double ADD(double left, double right)
{
	return left + right;
}
int ADD(long left, long right)
{
	return left + right;
}

C++支持函数重载,c语言不支持

4.auto关键字
使用auto关键字定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型。因此auto 并非是一种“类型”的声明而是一个类型声明时的“占位符”,编译器在编译器会将auto替换为变量实际的类型。

int main()
{
	int a = 9;
	auto b = a;
	auto c = 'a';
	cout << typeid(b).name << endl;
	cout << typeid(c).name << endl;

	return 0;
}

auto不能推倒的场景
1.auto不能作为函数的参数。
2.auto不能直接用来声明数组。

5.
c++的三大特性:封装,继承,多态
1.public成员在类外可以直接访问
2.protected和private成员在类外不能够访问
3.他们的作用域从访问限定符出现的位置开始直到下一个访问限制符出现为止
4.class的默认访问权限是private,而struct为public型(因为要兼容C)
5.一个类的大小,实际就是该类中成员变量之和,空类的大小为1字节(视现实而定)

6.this指针

this指针是成员函数第一个隐含的指针形参,一般情况下由编译器通过exc寄存器自动传递,不需要用户传递
寄存器:eax ebx ecx edx ebp esp…
空间小 速度快 离cpu近的存储空间

一般情况下内存中的数据要进行计算,基本上都是先将数据放到寄存器中,然后再来进行运算
在程序中可以将寄存器理解成全局变量
1.类的成员函数中有一个隐藏指针,指向调用该函数的对象本身
2.this指针的特性:
1.this指针的类型: *const
3.this指针是“类成员函数”的第一个默认隐含参数,编译器自动维护传 递类编写者不能显示传递
4.只有在类的非静态成员函数中才可以使用this指针,其他任何函数都不可以

7.类的默认6个成员函数
1构造函数
概念:构造函数是一个特殊的成员函数,名字与类名相同,创建类对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。

特性:
函数名与类名相同
无返回值
对象实例化时自动调用对应的构造函数
构造函数可以重载

默认的构造函数:
1.用户定义的无参构造函数
2.用户定义带有全缺省的构造函数——所有参数都带有默认值
3.如果用户没有显示定义任何构造函数,编译器会自动生成一个无参的构造函数

2.析构函数:
概念:与构造函数功能相反,对象在销毁时,由编译器自动调用。
作用:完成对象中资源的清理工作。
特性:

  1. 析构函数名是在类名前加上字符“~”
  2. 无参数 无返回值
  3. 一个类有且只有一个析构函数,
  4. 对象生命周期结束时,c++编译系统自动调用析构函数。
  5. 如果一个类中不涉及资源管理,析构函数可以不给出

****3.拷贝构造函数
构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用
特征:
拷贝构造函数是构造函数的一个重载形式。
拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式,会引发无穷递归调用
若未显示定义,系统生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝我们叫做浅拷贝,或者值拷贝。

浅拷贝
浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以 当继续对资源进项操作时,就会发生发生了访问违规。

赋值运算符的重载
运算符的重载
函数名为:关键字operator后面接需要重载的运算符符号。
注意:
不能通过连接其他符号来创建新的操作符:比如operator@
用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义

  • 、:: 、sizeof 、?: 、. 注意以上5个运算符不能重载。

const成员函数
const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰的是该成员隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改

const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的

explicit关键字
构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用表明该构造函数是显式的

void fun(Test& t);
fun(1);//这样调用是没有问题的,隐式类型转换会把1转换成Test的对象。
class Test
{
	public:
		explicit Test(int i);
};
Test t2 = 1;//编译报错
Test t2(2);//编译没问题

static成员
概念:
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化

类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值