波奇学C++:友元函数,友元类,内部类,匿名对象,优化构造

这篇具有很好参考价值的文章主要介绍了波奇学C++:友元函数,友元类,内部类,匿名对象,优化构造。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

友元函数/类 :突破访问限定符,允许非同一个类的函数或者类访私有成员变量。

class A
{
public:
	A()
		:_a(0)
		,_b(1)
	{
		cout << "A()" << endl;
	}
private:
	int _a = 0;
	int _b = 1;
};
void fun(const A& a)
{
	cout << a._a << endl;
}

这个代码会报错,原因是_a是a._a的私有成员,fun()是类外函数不能访问。

加上友元就可以突破限制

class A
{
	friend void fun(const A& a);
public:
	A()
		:_a(0)
		,_b(1)
	{
		cout << "A()" << endl;
	}
private:
	int _a = 0;
	int _b = 1;
};
void fun(const A& a)
{
	cout << a._a << endl;
}

关于友元的知识

友元函数是一种声明,表明这个函数可以访问私有变量。

友元函数本质上不属于类函数,所以这个声明是不受访问限定符限制的,可以定义在public或者private中。

一个函数可以是多个类的友元函数。

友元函数会破快封装性,所以尽量不要用友元。

友元类:

class A
{
	friend class B;
public:
	A()
		:_a(0)
		,_b(1)
	{
		cout << "A()" << endl;
	}
private:
	int _a = 0;
	int _b = 1;
};
class B
{
public:
	void fun(const A& a)
	{
		cout << a._a << endl;
	}
private:
	int _c = 1;
	
};

将fun封装到class B中,在A中用友元声明,使得fun()函数可以访问A中的私有成员变量。

内部类是在类中再嵌套一个类。

class A
{
	
public:
	class B
	{
	public:
		void fun(const A& a)
		{
			cout << a._a << endl;
		}
	private:
		int _c = 1;

	};
	A()
		:_a(0)
		,_b(1)
	{
		cout << "A()" << endl;
	}
private:
	int _a = 0;
	int _b = 1;
};

如图在class A中定义一个类class B

计算类的大小

cout << sizeof(A) << endl;//结果为8

我们知道计算类的大小是不计算函数的,那么B类为什么不会计算到其中,因为B类在其中相当于声明。当然class A也是一种声明,本身应该不应该有大小,sizeof是计算创建A的实例的大小。sizeof(A)可以看成创建类A的实例后计算大小,如果创建A的实例是不会有类B成员的,只有_a,_b成员。把代码修改成

class A
{
	
public:
	class B
	{
	public:
		void fun(const A& a)
		{
			cout << a._a << endl;
		}
	private:
		int _c = 1;

	};
	A()
		:_a(0)
		,_b(1)
	{
		cout << "A()" << endl;
	}
private:
	int _a = 0;
	int _b = 1;
	B b;
};

结果是12,计算了B类成员的大小。

1.类声明本身是没有大小的,相当于图纸。

2.sizeof(类),计算的是类的实例的大小。如果类创建的成员变量有内部类实例,那么会计算内部类的大小,如果成员变量没有,只有类声明那就不算内部类大小。

3.类大小只算成员变量大小。

内部类的性质

内部类是类的友元类,可以在内部类访问类的私有变量,但是类不是内部类的友元类,所以不能访问内部类的私有成员变量。

B可以访问_a,_b,A不能访问_c

匿名对象

class A
{
public:
	A()
		:_a(0)
		, _b(1)
	{
		cout << "A()" << endl;
	}
	void fun()
	{
		cout << "fun()" << endl;
	}
private:
	int _a = 0;
	int _b = 1;
};
A a;//有名对象
A();//匿名对象

有名对象无匿名对象的区别:

有名对象--生命周期在当前函数局部域。

匿名对象--生命周期在当前行。/这行代码运行结束后就会调用析构函数。*‘

有名对象不能加括号:不知道是对象还是函数名

A a();/无法分辨是对象还是函数,传参初始化是可以加。

匿名对象和临时对象具有常性。

const A&aa=A();

匿名对象如果被引用不会变成野引用 const引用延长了匿名对象的生命周期,生命周期在当前函数局部域,就是函数结束时才调用析构函数。

匿名函数的使用场景:更简单地调用类成员函数

//第一种方式
A a;
a.fun();
//第二种方式
A().fun();

传参时省略创建实例

波奇学C++:友元函数,友元类,内部类,匿名对象,优化构造

编译器会对同一条表达式调用多个构造函数时进行优化

如拷贝构造+构造函数可能直接被优化为构造函数。

A a=2;

这发生类型转换,先生成临时变量const A b(2),临时变量再对A拷贝构造A a(const A b),编译会直接优化成A a(2)不调用临时拷贝,但用const A& c=2,可以证明临时变量确实会生成。

接收传值时优化

返回A时有拷贝构造,生成临时对象,生成的临时对象初始化ra也调用拷贝构造。(不是等号运算符重载,因为A ra是被初始化的)

波奇学C++:友元函数,友元类,内部类,匿名对象,优化构造

 编译器会优化成两次拷贝构造会被合成一次拷贝构造。

//避免的写法
A ra;
A ra=fun5();
//这就不是两次构造了

 传参时优化文章来源地址https://www.toymoban.com/news/detail-446880.html

void fun6(A a)
{
}
//不是同一行表达式,不会优化,构造+拷贝构造
A a(1);
fun6(a);
//匿名,会优化
fun6(A(1));
//最佳写法,隐式类型转换,会优化
fun6(1);

到了这里,关于波奇学C++:友元函数,友元类,内部类,匿名对象,优化构造的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SYSU程设c++(第九周)函数对象、友元函数、友元类

    函数对象:         如果一个类 定义了operator()运算符函数 ,则 可以使用该类的对象名为函数名 调用这个函数.          函数对象是一个对象, 但 调用形式和普通函数调用一样 ,因此取名叫函数对象 (注意operator()先有个括号,接着才是括号(参数列表)) 友元函数:  f

    2023年04月23日
    浏览(31)
  • 【C++基础】类与对象(下) 初始化列表、友元、内部类、匿名对象

    ​👻内容专栏: C/C++编程 🐨本文概括: C++基础语法。初始化列表、 explicit 、 static 成员、友元、内部类、匿名对象、拷贝对象时的一些编译器优化等。 🐼本文作者: 阿四啊 🐸发布时间:2023.9.8 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个

    2024年02月09日
    浏览(48)
  • 【C++入门到精通】C++入门 —— 类和对象(初始化列表、Static成员、友元、内部类、匿名对象)

    目录 一、初始化列表 ⭕初始化列表概念 ⭕初始化列表的优点 ⭕使用场景 ⭕explicit 二、Static成员 ⭕Static成员概念 🔴静态数据成员: 🔴静态函数成员: ⭕使用静态成员的优点 ⭕使用静态成员的注意事项 三、友元 ⭕友元的概念 ⭕类友元 ⭕函数友元  四、内部类 ⭕

    2024年02月14日
    浏览(45)
  • 【C++技能树】类和对象的使用 --初始化列表,static,友元,内部类,匿名对象的理解与使用

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我bua! 这是一个C++的默认构造函数 虽然我们大多时候混淆初始化与赋值的概念,但在这里,构造函数体中只能成为 赋值 ,因为初始化只能初始化一次,而赋值可以赋值多次。 那么在哪里进行初始化呢

    2024年02月06日
    浏览(43)
  • C++ 类和对象(静态的static、友元、内部类、匿名对象、explicit)知识点+完整思维导图+实操图+深入细节通俗易懂建议收藏

            时间的步伐有三种:未来姗姗来迟,现在像箭一样飞逝,过往永远静立不动。本章是类和对象的一个收尾篇,相信通过这三篇类和对象的学习,应该你已经更加清楚了解了C++的类和对象。 话不多说安全带系好,发车啦 (建议电脑观看) 。 附:红色,部分为重点

    2024年02月06日
    浏览(47)
  • 【C++基础(六)】类和对象(下)--初始化列表,友元,匿名对象

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++初阶之路⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 关于类和对象的大致内容已经结束 本篇文章主要是介绍一些冗杂的细节 虽然本节的内容属于对类和对象锦上添花 但在很多特定的场所下,还是

    2024年02月14日
    浏览(61)
  • 【C++】初始化列表、static成员、友元、匿名对象、附练习题

    我们前面学习了关于类和对象的6个默认成员函数,知道了一个空类中有构造函数和析构函数,通过对对象初始化和对象中进行资源清理,达到初始化和销毁的作用。我们再对一些小的点进行补充,看看类和对象的一些细节。 1.1 构造函数体赋值 在创建对象时,编译器通过 调

    2024年02月22日
    浏览(51)
  • C++ 之 【类与对象】从入门到精通一条龙服务 最终篇(static成员、友元、匿名对象。。。)

    💴到用时方恨早,白首方悔挣的少 车到山前没有路,悬崖勒马勒不住 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀– 在创建对象时,编译器通过调用构造函数,给对象中各个

    2024年04月16日
    浏览(45)
  • 友元函数与友元类

    实验介绍 私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。声明为友元函数或友元类后就可以直接访问类中所有成员,但同时也破坏了类的封装性。 为什么在模板篇中讲解友元函数和友元类呢? 答

    2024年01月16日
    浏览(38)
  • 静态成员,友元函数,友元类

    🐶 博主主页: @ᰔᩚ. 一怀明月ꦿ  ❤️‍🔥 专栏系列: 线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++ 🔥 座右铭: “不要等到什么都没有了,才下定决心去做” 🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 🐰

    2024年01月22日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包