【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++语言旅途中有所帮助!

相关文章
|
5天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
28 4
|
6天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
23 4
|
29天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
26 4
|
29天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
22 4
|
29天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
19 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
53 1
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
19 1