C++ 复制构造和赋值操作符调用

主要是为了记录说明 :

class A;

A a;

A b = a; //这个是调用复制构造函数呢?还是先构造,再调用赋值操作符? 结果是前者。

测试代码:

#include <stdio.h>
#include <stdlib.h>

class A {
  public:
    A() {
      printf("%s\n", "A constructor");
    }

    A(const A &a) {
      this->data_ = a.data_;
      printf("%s\n", "A copy constructor");
    }

    A& operator=(const A &a) {
      this->data_ = a.data_;
      printf("%s\n", "A operator=");
    }
  private:
    int data_;
};

int main(int argc, char **argv) {
  A a;      // A constructor
  printf("-------------------\n");
  A b = a;  // A copy constructor
  printf("-------------------\n");
  A c;      // A constructor
  c = a;    // A operator=
  printf("-------------------\n");
  return 0;
}

C++ 复制构造和赋值操作符调用

时间: 2024-11-05 21:41:09

C++ 复制构造和赋值操作符调用的相关文章

C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)

在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋值操作符.我就斗胆将他们命名为六大函数好了. 一.构造函数 c++primer中说过:构造函数是特殊的成员函数,只要创建类类型的新对象,都要执行构造函数.构造函数的工作就是保证每个对象的数据成员具有合适的初始值. 构造函数与其他函数不同:构造函数和类同名,没有返回类型. 构造函数与其他函数相同:构造函数也有形参表(可为void)和函数体.  (参数表为void的构造函数为默认构造函数

C++学习基础六——复制构造函数和赋值操作符

1.什么是复制构造函数 复制构造函数:是构造函数,其只有一个参数,参数类型是所属类的类型,且参数是一个const引用. 作用:将本类的成员变量赋值为引用形参的成员变量. 2.什么是赋值操作符 赋值操作符:返回值是本类的引用类型,参数类型是所属类的类型,且参数是一个const引用. 作用与复制构造函数相同. 其声明如下: 1 Sales_item& operator=(const Sales_item& rig); 3.什么情况下需要我们自己实现复制构造函数和赋值操作符? 一般情况下,C++

C++ Primer 学习笔记_54_类与数据抽象 --复制构造函数、赋值操作符

复制控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,需要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用!      复制构造函数:具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数:当将该类型的对象传递给函数或者从函数返回该类型的对象时,将隐式使用复制构造函数.     析构函数:作为构造函数的互补,当对象超出作用域或动态分配的对象被删除

c++ 复制控制 之赋值操作符

 重载操作符      重载操作符是一些函数, 其名字为operator后跟着其所定义的操作符符号.  如operator =, operator +, operator * 等等. 操作符函数和普通函数一样, 也是 返回值 + 函数名 + (形参表) , 形参表必须具有与该操作符操作数数目相同的形参(如果操作符是一个成员, 则包括隐式this形参). 赋值操作符 赋值 是二元运算, 所以该操作符函数有两个形参: 第一个形参对应着左操作数, 第二个形参对应右操作数. 大多数操作符可以定义为成员函

13.1——复制构造函数,赋值操作符,析构函数

如果没有显式的定义复制构造函数和赋值操作符以及析构函数,编译器会为我们定义. 复制构造函数: (1)是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用. (2)当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数. (3)当将该类型的对象传递给函数或从函数返回该类型的对象时,将隐式的使用复制构造函数. 析构函数: (1)是构造函数的互补,当对象超过了作用域,或动态分配的对象被删除时,将自动的应用析构函数. (2)析构函数释放对象构造时所获

C++之复制构造函数和赋值操作符

拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象.拷贝构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的对象. 复制对象把它作为参数传递给函数. 复制对象,并从函数返回这个对象. 如果在类中没有定义拷贝构造函数,编译器会自行定义一个.如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数.拷贝构造函数的最常见形式如下: classname (const classname &obj) { // 构造函数的主体 } 在这里,o

复制构造函数和赋值操作符的注意点.

记得在复制构造函数和赋值操作符的参数类型上加上const.正确的复制构造函数应该是X::X(const X&)这种,而不是X::X(X&)这种,这里有两个原因. 第一:绑定一个非const引用到一个临时对象是非法的.使用X::X(X&)作为复制构造函数不会允许复制任何特殊表达式的结果.为什么呢.?因为引用的初始化规则规定了不能将临时变量作为引用的初始化值. 而常量引用除外. 此外:防止修改引用的值(这个大家都知道). 同样的道理: X::operator=(const X&

C++复制控制:赋值操作符和析构函数

一.赋值操作符 类定义了该类型对象赋值时会发生什么.与拷贝构造函数一样,如果类没有定义自己的赋值操作符,编译器会合成一个. 1.重载操作符的简单介绍 重载操作符是一些函数,其名字为operator后跟着所定义的操作符的符号,通过定义名为operator=的函数,我们可以对赋值进行定义.操作符函数的形参表必须具有与该操作数数目相同的形参(如果操作符是一个成员,则包括隐式this形参).赋值是二元操作符,对应的两个形参,第一个形参为左操作数,第二个形参为右操作数. 注意: (1)当操作符为成员函数时

字符串类的实现:构造函数、析构函数、复制构造函数和赋值操作符

强调一下几个重点: (1)new 操作符申请内存失败,是抛出异常,并不是返回NULL,若想申请失败返回NULL,需要加 (std::nothrow): (2)使用std::nothrow 需要加头文件 #include<new> (3)使用assert (4)构造函数有参数时最好加默认参数,这样就有默认构造函数了,且不要忘了定义为const (5)赋值操作符函数体if语句中的条件必须是 this != &other,为什么if(*this != other)不行???? 刚想了下原因是