C++类和对象 后篇

C++类和对象 后篇

构造函数的初始化列表🤔

  由于某些成员必须在定义时初始化(引用,const,自定义类型),所以在默认构造函数处初始化列表来解决问题。

  不管我们写不写初始化列表,每个成员都会经过它。并且缺省值给的是初始化列表,初始化列表初始化的顺序与声明顺序一致。初始化列表在默认构造函数处,以冒号开始逗号分割括号内为参数,这是C++规范准则,无法更改

  每个成员变量在初始化列表中仅经过一次,与函数体内的初始化有区别,函数体内的初始化更应该称为赋值。以下面代码为例:

class Date {
public:
	Date(int year, int month, int day, int& i)
		:_year(year), //day也会经过初始化列表,但是内置类型编译器不处理,所以是随机值
		_month(month),
		_x(10),
		ref(i),
		_a(100) //如果不写也会处理,自定义类型会去调默认构造
	{
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
	const int _x;
	int& ref;
	A _a; //自定义类型
};

隐式类型转换🤔

  C++支持单参数构造函数的隐式类型转换,如下代码:

class A {
public:
	A(int a)
		:_a(a)
	{
		cout << _a << endl;
	}
	A(const A& a)
		:_a(a._a)
	{
		cout << "a" << endl;
	}
	~A()
	{

	}
private:
	int _a;
};

  隐式类型转换会在两个类型间建立一个临时变量,然后才进行转换,不过在某些场景新版编译器会进行优化,使其跳过拷贝构造。如下图:

Pasted image 20240713233205

Pasted image 20240713233411

  并且,C++11支持多参数的隐式类型转换:

image-20240717200434947

  如果不想要隐式类型发生,只需要在构造函数前面加explicit就行:

image-20240717200618721

匿名对象🤔

  对象分为两种类型,一种为匿名对象,一种为有名对象,有名对象的生命周期在当前局部域,匿名对象的生命周期仅在这一行。匿名对象具有常性

Pasted image 20240714000845

  匿名对象一般用于确定只使用一次时,可以简化代码

image-20240717201216190

  使用const修饰匿名对象可以延长生命周期。下图匿名对象会在ref出了作用域才会销毁。

Pasted image 20240715114536

static成员函数🤔

  在类创建了static成员,那么就变成了对象公有成员(存在静态区中),static不走初始化列表,所以不能给缺省值,需要在类中声明,类外定义

image-20240717201447790

  如果创建了一个静态成员函数,那么它没有this指针,可以直接用类域调用,并且静态成员函数不能访问非静态成员

image-20240717201744621

image-20240717201827555

友元🤔

  友元分为友元函数和友元类,它能放在类中的任何位置,其代码为:

friend 函数声明; //如friend void Print(); 声明Print函数为友元函数
friend class 类名; //friend class B; 声明B为友元类 注:只能单方面友元

  友元有以下特性:

  1. 友元函数可访问类的私有和保护成员,但不是类的成员函数
  2. 不能用const修饰
  3. 不受访问限定符限制
  4. 一个函数可以是多个类的友元
  5. 友元函数的调用与普通函数的调用原理相同

内部类🤔

  在类中再创建一个类,不过它俩还是独立的两个类,内存大小都为4字节,调用方法(public限定符下)为C:😄 dd,并且内部类是外部类的友元该题专门说明了static和内部类的用法,感兴趣可以看看。

Pasted image 20240715105738

拓展知识🤔

  每个编译器优化不同,编译器优化不属于C++标准规定。当构造函数和拷贝函数在同一步骤时,编译器会进行优化,使构造和拷贝合二为一。

Pasted image 20240715115849

  这里本该是拷贝构造两次,一次是aa拷贝给临时对象,临时对象再拷贝给ret,编译器优化以后aa直接拷贝给ret(也需要在同一步骤中)

Pasted image 20240715120635

  这里由于返回值会创建临时变量造成拷贝,所以也优化了

Pasted image 20240715121359

结尾👍

  以上便是本篇博客全部内容,如果有疑问或者建议都可以私信笔者交流,大家互相学习,互相进步!🌹

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 09:16:01       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 09:16:01       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 09:16:01       57 阅读
  4. Python语言-面向对象

    2024-07-18 09:16:01       68 阅读

热门阅读

  1. 构建艺术:在Gradle中配置父子项目的关系

    2024-07-18 09:16:01       24 阅读
  2. (79)组合环路--->(03)组合环路代码示例一

    2024-07-18 09:16:01       21 阅读
  3. npm 设置镜像

    2024-07-18 09:16:01       19 阅读
  4. https 单向认证和双向认证

    2024-07-18 09:16:01       19 阅读
  5. 游戏中的敏感词算法初探

    2024-07-18 09:16:01       22 阅读
  6. opencv—常用函数学习_“干货“_11

    2024-07-18 09:16:01       23 阅读
  7. 云原生理解

    2024-07-18 09:16:01       23 阅读
  8. 银河麒麟部署 QtMqtt 解决 make 错误问题的教程

    2024-07-18 09:16:01       20 阅读
  9. 伪元素::before :: after的用法?

    2024-07-18 09:16:01       22 阅读
  10. C语言从头学35——struct结构

    2024-07-18 09:16:01       20 阅读