【c++】内部类和匿名对象

news/2024/10/19 7:26:38/

1.内部类

1.概念

概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限

注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元

2.特性

特性:

  1. 内部类可以定义在外部类的public、protected、private都是可以的
  2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名
  3. sizeof(外部类)=外部类,和内部类没有任何关系
class A
{
private:static int k;int h;
public:class B // B天生就是A的友元{public:void foo(const A& a){cout << k << endl;//OKcout << a.h << endl;//OK}};
};
int A::k = 1;
int main()
{A::B b;b.foo(A());return 0;
}

2.匿名对象 

class A
{
public:A(int a = 0):_a(a){cout << "A(int a)" << endl;}~A(){cout << "~A()" << endl;}
private:int _a;
};
class Solution {
public:int Sum_Solution(int n) {//...return n;}
};
int main()
{A aa1;// 不能这么定义对象,因为编译器无法识别下面是一个函数声明,还是对象定义//A aa1();// 但是我们可以这么定义匿名对象,匿名对象的特点不用取名字,// 但是他的生命周期只有这一行,我们可以看到下一行他就会自动调用析构函数A();A aa2(2);// 匿名对象在这样场景下就很好用Solution().Sum_Solution(10);return 0;
}

3.拷贝对象时的一些编译器优化 

在传参和传返回值的过程中,一般编译器会做一些优化,减少对象的拷贝,这个在一些场景下还是非常有用的

class A
{
public:A(int a = 0):_a(a){cout << "A(int a)" << endl;}A(const A& aa):_a(aa._a){cout << "A(const A& aa)" << endl;}A& operator=(const A& aa){cout << "A& operator=(const A& aa)" << endl;if (this != &aa){_a = aa._a;}return *this;}~A(){cout << "~A()" << endl;}
private:int _a;
};
void f1(A aa)
{}
A f2()
{A aa;return aa;
}
int main()
{// 传值传参A aa1;f1(aa1);cout << endl;// 传值返回f2();cout << endl;// 隐式类型,连续构造+拷贝构造->优化为直接构造f1(1);// 一个表达式中,连续构造+拷贝构造->优化为一个构造f1(A(2));cout << endl;// 一个表达式中,连续拷贝构造+拷贝构造->优化一个拷贝构造A aa2 = f2();cout << endl;// 一个表达式中,连续拷贝构造+赋值重载->无法优化aa1 = f2();cout << endl;return 0;
}

http://www.ppmy.cn/news/1342399.html

相关文章

微信小程序实现时间轴效果

目录 引言时间轴效果的应用场景微信小程序的优势时间轴效果的设计思路时间轴界面布局数据结构设计实现时间轴效果WXML结构设计WXSS样式设计JavaScript逻辑实现说明引言 时间轴效果的应用场景 时间轴效果作为一种独特且直观的信息展示形式,已经被广泛应用于各种场景中,提供了…

在Python中如何处理文件读写操作

目录 打开文件 读取文件 写入文件 处理文件的其他操作 使用with语句 错误处理 文件编码 总结 在Python中处理文件读写操作是一个基础且常用的技能。这里我将从以下几个方面进行详细介绍&#xff1a;打开文件、读取文件、写入文件、处理文件的其他操作&#xff0c;以及最…

Unity DOTS中的baking(三)过滤baking的输出

Unity DOTS中的baking&#xff08;三&#xff09;过滤baking的输出 默认情况下&#xff0c;在conversation world&#xff08;baker和baking system运行的环境&#xff09;下产生的所有entities和components&#xff0c;都会作为baking环节的输出。在baking结束时&#xff0c;U…

2023-12蓝桥杯STEMA考试 C++ 中高级试卷解析

蓝桥杯STEMA考试 C++ 中高级试卷(12月) 一、选择题 第一题 定义字符串 string a = "Hello C++",下列选项可以获取到字符 C 的是(B)。 A、a[7] B、a[6] C、a[5] D、a[4] 第二题 下列选项中数值与其它项不同的是( C)。 A、 B、 C、 D、 第三题 定义变量 int i =…

洗地机哪个品牌质量好?盘点当下最值得买的4款洗地机型号推荐

随着生活节奏的加快&#xff0c;人们对于家庭清洁的需求也越来越迫切。而洗地机作为家庭清洁利器备受青睐&#xff0c;但洗地机也分为很多款式&#xff0c;每一个款式都具备不同的清洁效果&#xff0c;可以节省不少时间。接下来&#xff0c;就由笔者为大家详细介绍一下洗地机哪…

LLVM实战之C源码编译

目录 1. 详细步骤 2. 工作原理 本文将展示使用Clang&#xff08;C语言前端&#xff09;&#xff0c;把C语言源码转换成LLVM IR 。当然首先需要安装Clang并且把它添加到PATH环境中。 1. 详细步骤 &#xff08;1&#xff09;首先准备测试文件&#xff0c;在multiply.c文件编写…

5分钟轻松了解一个HTTP请求的处理过程

上一章节我们学习了自动注入、AOP 等 Spring 核心知识运用上的常见错误案例。然而&#xff0c;我们使用 Spring 大多还是为了开发一个 Web 应用程序&#xff0c;所以从这节课开始&#xff0c;我们将学习 Spring Web 的常见错误案例。 在这之前&#xff0c;我想有必要先给你简单…

Go 函数 可变参数

有的时候&#xff0c;我们定义函数&#xff0c;都是形参固定&#xff0c;有时候我们并不知道参数有多少个&#xff0c;这里我们就可以用... 来使用可变参数 代码如下&#xff1a; package main import "fmt"//定义一个函数&#xff0c;函数的参数为&#xff1a;可变…