IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> <C++>初始化列表_static成员_友元 -> 正文阅读

[C++知识库]<C++>初始化列表_static成员_友元

目录

一、初始化列表

excplicit关键字

?二、static成员

三、友元


一、初始化列表

class Date
{
public:
 Date(int year, int month, int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }
private:
 int _year;
 int _month;
 int _day;
};

对于构造函数,如上代码,在创建对象时,调用构造函数后,类成员会有一个初始值,但这样并不是初始化,初始化只能有一次,而在函数里可以有多次赋值。

使用初始化列表才是对类成员的初始化

在函数定义后面加”:“,有多个值用逗号隔开

class A
{
public:
	A(int a = 10, int b = 20)
		:_a(a)
		,_b(b)
	{

	}
private:
	int _a;
	int _b;
};

此外,C++11中对于缺省参数的补丁其实本质也是初始化列表

class A
{
public:

private:
	int _a = 10;
	int _b = 20;
};

注意:

1、初始化列表中的成员变量只能初始化一次

2、引用成员变量、const成员变量、没有默认构造函数的自定义类

初始化列表的成员变量初始化顺序是根据声明顺序,而不是给值的顺序

excplicit关键字

防止隐式类型转化

构造函数不仅可以用于初始化的作用,还可以用于隐式类型转换

class A
{
public:
	A(int a = 10)
		:_a(a)
	{

	}
private:
	int _a = 10;
	int _b = 20;
};

int main()
{
	A a1(100);
	A a2 = 200; //发生类型转换,先生成tmp临时变量,在将tmp拷贝给a2

	return 0;
}

在构造函数前面加一个explicit关键字就可以制止类型转换

?二、static成员

在类中的成员变量是所有这个类共享的,且只能在类外定义和初始化。

?静态成员函数没有this指针,所以无法访问普通成员变量,但可以访问静态成员变量。

访问静态成员时,可以类名::静态成员

三、友元

友元是一种突破class类封装的一种语法

  • 友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数不能用const修饰
  • 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
  • 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同

friend关键字

友元顾名思义就是这个类的朋友。类外部的函数是不能访问类的私有成员的,使用友元就可以使其能够访问类的私有成员

语法:在类中用friend关键字声明外部的函数、类等

友元函数

在类中声明外部定义的函数,外部的函数就可以访问类中的私有成员

class A
{
	friend void Print(A& a1); //声明是A类的友元函数
public:
	A(int a = 0)
		:_a(a)
	{

	}
private:
	int _a;
};

void Print(A& a1)
{
	cout << a1._a;
}

int main()
{
	A a1(10);

	Print(a1);

	return 0;
}

友元类

在类中声明外部定义的类,外部定义的类就可以访问这个类中的私有成员了

注意:B是A的友元类,但A并不是B的友元类

class A
{
	friend class B; //声明B是A的友元类
public:
	A(int a = 0)
		:_a(a)
	{

	}
private:
	int _a;
};

class B
{
public:
	B(int b = 0)
		:_b(b)
	{

	}

	void Print(A& a1)
	{
		cout << a1._a;
	}
private:
	int _b;
};


int main()
{
	A a1(10);
	B b1;

	b1.Print(a1);

	return 0;
}

内部类

在类中定义类,比如在A类中定义B类,B类就是A的友元类,但A不是B的友元类

内部类

  • 注意定义在public、private、protect都是可以的
  • 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
  • . sizeof(外部类)=外部类,和内部类没有任何关系。
class A
{
public:
	A(int a = 0)
		:_a(a)
	{

	}
private:
	int _a;

public:
	class B
	{
	public:
		B(int b = 0)
			:_b(b)
		{

		}

		void Print(A& a1)
		{
			cout << a1._a;
		}
	private:
		int _b;
	};
};

int main()
{
	A a1(10);
	A::B b1;

	b1.Print(a1);

	return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 18:45:50  更:2022-08-19 18:48:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 13:06:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码