【C++】深入探索类和对象:初始化列表及其static成员与友元(三)

简介: 【C++】深入探索类和对象:初始化列表及其static成员与友元

【C++】深入探索类和对象:初始化列表及其static成员与友元(二)https://developer.aliyun.com/article/1617302


六、内部类(了解即可,基本没人使用)

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

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

class A
{
private:
  int h;
public:
  class B
  {
  public:
    void Print(const A& a)
    {
      cout << a.h << endl;
    }
  private:
    int h2;
  };
};
int main()
{
  A::B b;
  b.Print(A());//A()构造函数,在通过引用接受,调用成员
  return 0;
}

内部类小结:

  • 内部类可以定义在外部类的public、protected、private都是可以的
  • 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象类名
  • sizeof(外部类)=外部类,跟内部类没有任何关系
  • 内部类这个类收到外部类的类域的限制
  • C++不喜欢使用内部类,类独立更好使用。

七、匿名对象

字面意思不写对象名,在使用该对象方便一点点

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();
  A aa2(2);
  //匿名对象在这种场景下就很好用,当然还有一些其他场景
  Solution().Sum_Solution(10);
  return 0;
}

匿名对象小结:

  • 虽然不能A aa1()去定义对象(编译器无法识别),但是可以A()定义匿名对象
  • 匿名对象是不用取名字
  • 匿名对象的生命周期只有这一行,下一行就会自动调用析构函数

八、拷贝对象时编译器优化

在传值和传返回值的构成中,一般编译器会做一些优化,减少对象的拷贝,这个一些场景下还是非常有用的。(不同平台就有不同的结果,需要看编译器优化情况和变量大小

结果:图一:构造+拷贝

图二:构造+拷贝+拷贝 优化为 构造+拷贝,这里retf3函数结束前,使用aa拷贝ret

图三:构造+拷贝+拷贝优化构造,编译器很聪明的,直接优化成构造给值ret

  • 类A提供了显式的构造函数和拷贝构造函数,编译器可能会避免执行一些默认的优化,就按照提供的函数处理,而不会尝试使用更高效的默认实现。
  • 如果没有提供显式构造和拷贝函数,编译器选择使用默认生成的函数可能进行优化,优化可以减少不必要的构造函数调用,提高代码的效率。

九、再次理解类和对象

在类和对象阶段。类时对某一类实体(对象)来进行描述的,描述该对象具有那些属性、方法、完成后就形成了一种新的自定义类型,才能该自定义类型就可以实例化具体的对象。

关于一道静态成员变量题目

求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句,位运算。

class Sum
{
public:
    Sum()
    {
        _i=_i+1;
        _sum+=_i;
    }
    static int Get_sum()
    {
        return _sum;
    }
 private:
    static int _i;
    static int _sum;
};
 int Sum:: _i;
 int Sum:: _sum;
class Solution 
{
public:
    int Sum_Solution(int n) 
    {
        Sum a[n];//看调用多少次构造函数
        return Sum::Get_sum();
    }
};

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二呀C++笔记,希望对你在学习C++语言旅途中有所帮助!

相关文章
|
1天前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
12 3
|
1天前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
14 3
|
1天前
|
存储 C++
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
10 2
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
|
1天前
|
存储 编译器 C语言
C++类与对象深度解析(一):从抽象到实践的全面入门指南
C++类与对象深度解析(一):从抽象到实践的全面入门指南
15 8
|
1天前
|
C++
【C++】实现日期类相关接口(三)
【C++】实现日期类相关接口
|
1天前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
18 4
|
1天前
|
安全 编译器 C++
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
9 3
|
1天前
|
C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(二)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
1天前
|
存储 编译器 程序员
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
17 2
|
1天前
|
安全 编译器 程序员
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
9 2