C++中的空类,默认产生哪些类成员函数?

YOLOv11改进策略【注意力机制篇】| SE、CBAM、ECA、CA、Swin Transformer等注意力机制全面解析与应用 本文详细介绍了五种主流的注意力机制及其在YOLOv11中的应用。通过合理的模块选择和位置部署,注意力机制能够显著提升目标检测性能。 阅读详情
答:

class Empty

{

  public:

      Empty(); // 缺省构造函数

      Empty( const Empty& ); // 拷贝构造函数

      ~Empty(); // 析构函数

       Empty& operator=( const Empty& ); // 赋值运算符

       Empty* operator&(); // 取址运算符

       const Empty* operator&() const; // 取址运算符 const

};

默认构造函数 
析构函数 
拷贝构造函数 
赋值运算符(operator=) 
取址运算符(operator&)(一对,一个非const的,一个const的) 

     当然,所有这些只有当被需要才会产生。比如你定义了一个类,但从来定义过该类的对象,也没使用过该类型的函数参数,那么

基本啥也不会产生。在比如你从来没有进行过该类型对象之间的赋值,那么operator=不会被产生。

class Empty
{
public:
          Empty();                  //   缺省构造函数

          Empty(const   Empty&);    //   拷贝构造函数

          ~Empty();                 //   析构函数

          Empty& perator=(const Empty&); //   赋值运算符

           Empty* operator&();              //   取值运算符
          const Empty* operator&() const;   //   取值运算符

};


例如有以下class:

class StringBad
{
 private :
         char   * str;
          int len;

 public :
           StringBad( const   char   * s);
           StringBad();
           ~ StringBad();

} ;


在构造函数和析构函数定义当中有如下定义:

StringBad::StringBad( const   char   * s)
{
         len = std::strlen(s);
         str =   new   char [len +   1 ];

}

StringBad::StringBad()
{
        len =   4 ;
        str =   new   char [ 4 ];

}

StringBad:: ~ StringBad()
{

        delete [] str;
}

    那么在程序当中如果有以下代码:

    StringBad sports( " Spinach Leaves Bow1 for bollars " );

    StringBad sailor = sports;

    以上的第二条初始化语句将会调用什么构造函数?记住,这种形式的初始化等效于下面的语句:

    StringBad sailor = StringBad(sports);

    因为sports的类型为StringBad,因此相应的构造函数原型应该如下:

    StringBad( const StringBad & );

      当我们使用一个对象来初始化另一个对象时,编译器将自动生成上述构造函数(称为复制构造函数,因为它创建对象的一

个副本)。

      现在我们来看看我们没有定义复制构造函数的情况下调用隐式复制构造函数将会出现什么情况。

      从构造函数定义的代码片断可以看到,当中使用new操作符初始化了一个指针str,而隐式的复制构造函数是按值进行复制

的,那么对于指针str,将会进行如下复制:

      sailor.str = sports.str;

       这里复制的不是字符串,而是一个指向字符串的指针!也就是说,我们将得到两个指向同一个字符串的指针!由此会产生的

问题将不言而喻。当其中一个对象调用了 析构函数之后,其str指向的内存将被释放,这个时候我们如果调用另一个对象,其

str指向的地址数据会是什么?很明显将会出现不可预料的结果。

       所以由此可见,如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针,

这被称为深度复制。因为默认的浅复制(或成为成员复制)仅浅浅的赋值指针信息。

      我们再看以下代码片断,我们稍做修改:

      StringBad headline1( " Celery Stalks at Midnight " );

      StringBad knot;

      knot = headline1;

       这里的最后一行将与以上例子有所区别,现在是将已有对象赋给另一个已有对象,这将会采取其他操作,即使用重载的赋值

操作符。(我们需要知道的是:初始化总是会调用复制构造函数,而使用=操作符时也可能调用赋值操作符)因为C++允许对

象赋值,这是通过自动为类重载赋值操作符实现的。其原型如下:

      Class_name & Class_name:: operator   = ( const Class_name & );

      它接受并返回一个指向类对象的引用。

      与隐式的复制构造函数一样,隐式的对象赋值操作符也会产生同样的问题,即包含了使用new初始化的指针成员时,只会采

用浅复制。所以我们需要使用同样的解决办法,即定义一个重载的赋值操作符来实现深度复制。

      所以综上所述,如果类中包含了使用new初始化的指针成员,我们应该显式定义一个复制构造函数和一个重载的赋值

操作符来实现其深度复制,避免由此带来的成员复制问题

    1. 以下函数哪个是拷贝构造函数,为什么?

    X::X(const X&);

    X::X(X);

    X::X(X&, int a=1);

    X::X(X&, int a=1, b=2);

    2. 一个类中可以存在多于一个的拷贝构造函数吗?

    3. 写出以下程序段的输出结果, 并说明为什么? 如果你都能回答无误的话,那么你已经对拷贝构造函数有了相当的了解。

#include <iostream>
#include <string>

struct X {
template<typename T>
      X( T& ) { std::cout << "This is ctor." << std::endl; }

template<typename T>
      X& perator=( T& ) { std::cout << "This is ctor." << std::endl; }
};

void main() {
      X a(5);
      X b(10.5);
      X c = a;
      c = b;
}

 

    解答如下:

    1. 对于一个类X,如果一个构造函数的第一个参数是下列之一:

    a) X&

    b) const X&

    c) volatile X&

    d) const volatile X&

    且没有其他参数或其他参数都有默认值,那么这个函数是拷贝构造函数。

    X::X(const X&); //是拷贝构造函数

    X::X(X&, int=1); //是拷贝构造函数

   2.类中可以存在超过一个拷贝构造函数,

class X {
public:
      X(const X&);
      X(X&);            // OK
};
注意,如果一个类中只存在一个参数为X&的拷贝构造函数,那么就不能使用const X或volatile X的对象实行拷贝初始化。

class X {
public:
     X();
     X(X&);
};

const X cx;
X x = cx;    // error

    如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数。

    这个默认的参数可能为X::X(const X&)或X::X(X&),由编译器根据上下文决定选择哪一个。

    默认拷贝构造函数的行为如下:

    默认的拷贝构造函数执行的顺序与其他用户定义的构造函数相同,执行先父类后子类的构造。

    拷贝构造函数对类中每一个数据成员执行成员拷贝(memberwise Copy)的动作。

    a)如果数据成员为某一个类的实例,那么调用此类的拷贝构造函数。

    b)如果数据成员是一个数组,对数组的每一个执行按位拷贝。

    c)如果数据成员是一个数量,如int,double,那么调用系统内建的赋值运算符对其进行赋值。

    3. 拷贝构造函数不能由成员函数模版生成。

struct X {
template<typename T>
      X( const T& );    // NOT copy ctor, T can't be X

 template<typename T>
      perator=( const T& ); // NOT copy ass't, T can't be X
};

        原因很简单, 成员函数模版并不改变语言的规则,而语言的规则说,如果程序需要一个拷贝构造函数而你没
有声明它,那么编译器会为你自动生成一个。 所以成员函数模版并不会阻止编译器生成拷贝构造函数, 赋值运算
符重载也遵循同样的规则。(参见Effective C++ 3edition, Item45)
Python散点图(Scatter Plot):高阶分析、散点图矩阵、三维散点图及综合应用 散点图作为一种直观且功能强大的数据可视化工具,在数据分析中具有广泛的应用。通过观察散点图中数据点的分布模式,我们可以轻松地判断变量之间是否存在相关性,以及相关性的类型和强度。同时,散点图也是识别数据集中异常值的有效工具,无论是通过直观观察还是结合统计方法,都能帮助我们发现数据中的异常情况。掌握散点图的绘制和分析技巧,将使我们在数据探索和决策制定中更加得心应手。 阅读详情

相关推荐

别再瞎试了!用Python+正交设计,5分钟搞定你的多因素实验方案

本文介绍了如何利用Python和正交设计高效优化多因素实验方案。正交设计通过精心设计的正交表,用最少的实验次数覆盖所有因素的水平组合,显著提升实验效率。文章详细讲解了正交设计的核心优势、Python实现工具链、实验实施与数据分析方法,以及高级技巧与常见问题解决方案,帮助读者快速掌握这一强大的实验优化技术。

weixin_42526087的博客 332

C++ 空类中有哪些成员函数

赋值函数是把一个新的对象赋值给一个原有的对象,所以如果原来的对象中有内存分配先要把内存释放掉,而且要检查一下两个对象是否为同一个对象,如果是不做任何操作,直接返回。通常,如果一个类中包含指向动态分配存储空间的指针类型的成员变量时,就应该为这个类设计一个拷贝构造函数,除了需要设计一个拷贝构造函数之外,还需要为它添加一个赋值操作符重载函数。拷贝构造函数是一个对象初始化一块内存区域,这块内存就是新对象的内存区,赋值运算符是对于一个已经初始化的对象来进行赋值操作。对象存在,用别的对象来给它赋值,就是赋值函数;

weixin_45805339的博客 2804

macOS 12.7.6部署Ollama+Dify避坑指南

本文介绍了在macOS 12.7.6系统下部署Ollama和Dify的详细步骤及避坑指南。主要内容包括:1)关闭系统完整性保护(SIP)以允许修改系统目录;2)安装特定版本的Docker(2.1.0.5)和docker-compose(v2.38.2)以避免兼容性问题;3)配置Ollama服务并下载nomic-embed-text和deepseek-r1:7b模型;4)针对macOS调整Dify的docker配置文件,包括延长超时时间、修改存储路径、增加资源限制等关键设置。文中提供了完整的命令操作步骤和配置

Hi20240217的博客 3100

C++空类中有哪些默认的函数?

1、构造函数 2、拷贝构造函数 3、析构函数 4、赋值操作符重载函数 5、取地址操作符重载函数 6、const修饰的取地址操作符重载函数 详解6个默认的函数:https://blog.youkuaiyun.com/qq_26079093/article/details/92974798 ...

请叫我皮皮虾的博客 2163

S7-200SMART系列全套接线说明

SMART200接线方法,输入,输出,模拟量,面板,扩展糟等,并且详细说明接线原理。

文都龙哥 1万+

云模型在综合评价过程中的应用

目录 1 云模型标尺(标准云模型)的构建方法 1.1 通过正态云的“3En 规则”来表示评价论域 1.2 通过论域的边界值隶属度相等来表示评价论域 1.3 通过黄金分割法来表示评价论域 2 确定评价结果的过程 2.1 基本云发生器 2.2 X条件云发生器 2.3 两种方法的区别 综合评价问题一般分为以下六个步骤 1、明确评价目的; 2、确定被评价对象; 3、建立评价指标体系(包括收集评价指标的原始值、评价指标的若干预处理等); 4、确立与各项评价指标相对应的权重系数; 5、选..

weixin_62223576的博客 1万+

C++中的空类,默认产生的类成员函数

C++中的空类,默认产生的类成员函数class Empty  {         public:                  Empty();                  //   缺省构造函数                  Empty(const   Empty&);    //   拷贝构造函数                  ~Empty();         

叶现一的专栏 1146

保姆级教程:用Ubuntu 22.04搭建RustDesk中继服务器(含Cloudflare避坑指南)

本教程详细指导如何在Ubuntu 22.04上搭建RustDesk中继服务器,解决跨国远程协作的延迟问题。涵盖环境配置、Rust编译优化、服务部署及Cloudflare代理设置等关键步骤,帮助用户实现高性能的私有中继服务。

weixin_29002209的博客 526

C++中的空类默认产生哪些类成员函数?

如果你只是声明一个空类,不做任何事情的话,编译器会自动为你生成一个默认构造函数、一个拷贝默认构造函数、一个默认拷贝赋值操作符和一个默认析构函数。这些函数只有在第一次被调用时,才会别编译器创建。所有这些函数都是inline和public的。定义一个空的C++类,例如class Empty { }一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member functio

爱橙子的OK绷的专栏 6327

基于CANoe的Basic Diagnostics ECU (UDS)

基于CANoe的Basic Diagnostics ECU (UDS)

farmer00的博客 9153

如何编写 Skill 实现自动化用例生成

Skill 本质上是一组结构化的指令和工具定义,它告诉 AI 模型在特定场景下应该遵循什么流程、调用哪些工具、输出什么格式的内容。元信息:名称、描述、版本等。指令(Instructions):定义 AI 的行为准则和任务流程。工具(Tools):AI 可以调用的外部能力,如文件读写、代码执行、API 请求等。上下文(Context):预设的输入输出格式或示例。编写一个用于自动生成测试用例的 Skill,核心在于定义清晰的指令流程和输出规范。

Cesare的博客 2690

C++中的空类,默认产生那些类成员函数

class Empty { public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty();

风言的专栏 597

AI工具赋能日常工作的实践指南:以产品经理与程序员为例

AI工具赋能日常工作的实践指南:以产品经理与程序员为例

专注于编程、AI、人工智能等多个领域内容研究和分析 591

C++中的空类默认产生哪些类成员函数

C++中的空类,默认产生哪些类成员函数?[C++易] 答: class Empty{public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数~Empty(); // 析构函数...

weixin_30716725的博客 116

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++中的空类,默认产生哪些类成员函数

1:默认构造函数 2:默认拷贝构造函数 3:默认赋值操作符 4:默认虚构函数 5:取值操作符. 如 class A { A(); A(const A &lhs); A& operator=(const A &lhs); ~A(); A* opeator&(); } sizeof(A) = 1

eric_arrow的专栏 630

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++ 中的空类,默认产生哪些类成员函数?

class Empty { public: Empty(); // 缺省构造函数  Empty( const Empty& ); // 拷贝构造函数  ~Empty(); // 析构函数  Empty& operator=( const Empty& ); // 赋值运算符  Empty* operator&(); // 取址运算符  const Empty* operator&(

Snippet 1707

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++中的空类,默认产生哪些类成员函数

class Empty { public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty(); // 析构函数 Empty& operator=( const Empty& )

488

C++中的空类默认产生的类成员函数

对于一个C++的空类:比如Empty: 1     class  Empty 2     { 3     } ;       虽然Empty类定义中没有任何成员,但为了进行一些默认的操作,编译器会加入以下一些成员函数,这些成员函数使得类的对象拥有一些通用的功能》 (1)默认构造函数和复制构造函数。他们被用于类的对象的构造过程。 (2)析构函数。它被用于类的对象的析构过程。 (3)赋值

perfect-顾(coder)的博客 717
上一篇: 非C++内建型别A和B, 在哪几种情况下B能隐式转化为A?
下一篇: 内部排序法——冒泡排序法
willian0621
博客等级 码龄17年 50粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值