构造函数初始化和赋值的区别

1.C 中, 对于简单类型的赋值和初始化的区别基本可以忽略

2.当涉及到类或者复杂的数据类型时,问题就变得不那么简单了,下面以一个例子来引入话题

#include <iostream>using namespace std;class Point  {      public:          Point(int a=0, int b=0):x(a), y(b)        {            cout<<"use the init construct"<<endl;        };          ~Point()        {        };          Point(const Point &p)        {            cout<<"use the copy construct"<<endl;        }        Point& operator =(const Point &rhs);          int x;          int y;  };  Point& Point::operator =(const Point &rhs)  {      x = rhs.x 1;      y = rhs.y 1;      cout<<"use the equal construct"<<endl;    return *this;  }int main(void)  {      Point p(1,1);      cout<<"p1 first:p1.x="<<p.x<<" "<<"p1.y="<<p.y<<endl;     Point p1 = p; //初始化操作     cout<<"p1 second:p1.x = "<<p1.x<<" "<<"p1.y="<<p1.y<<endl;      cout<<"---------------2--------------"<<endl;    Point p2;      cout<<"p2 first: p2.x = "<<p2.x<<" "<<"p2.y="<<p2.y<<endl;      p2 = p;      //赋值操作      cout<<"p2 second: p2.x = "<<p2.x<<" "<<"p2.y="<<p2.y<<endl;      return 0;   } 

test result

use the init constructp1 first:p1.x=1 p1.y=1use the copy constructp1 second:p1.x = 0 p1.y=0---------------2--------------use the init constructp2 first: p2.x = 0 p2.y=0use the equal constructp2 second: p2.x = 2 p2.y=2

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

可以看到赋值操作和初始化操作打印的结果,只在赋值操作中调用了重载“=”的函数。

而在初始化中的“=”调用的是默认的构造函数

为了证实初始化中的“=”调用的是默认的构造函数,我们可以做如下处理:

根据effctive c 条款05描述,定义了一个空类,如果没有声明,系统自动会声明一个默认构造函数,复刻构造函数,析构函数,和一个运算符重载函数。

class Empty{};

就好像你写下如下代码:

class Empty{

    public :

        Empty(){..}

        Empty(const Empty&rts){...}

        ~Empty() {...}

        Empty &operator=(const Empty &rts){...}

}

条款06又描述了如不想使用编译器自动生成的函数,就该明确拒绝,具体做法是将相应的成员函数声明为private并且不予实现,因此上述的程序可以改成这样。

#include <iostream>using namespace std;class Point{    public:        Point(int a=0, int b = 0):x(a), y(b)        {        }        ~Point()        {         }        Point& operator=(const Point &rhs);        int x;        int y;        private:           Point(const Point &p);};Point& Point::operator =(const Point &rhs) {    x = rhs.x 1;     y = rhs.y 1;    return *this;}int main(void){     Point p(1,1);    Point p1 = p; //初始化操作    Point p2;    p2 = p;//赋值操作    cout<<"p1.x = "<<p1.x<<" "<<"p1.y="<<p1.y<<endl;    cout<<"p2.x = "<<p2.x<<" "<<"p2.y="<<p2.y<<endl;    return 0;}

run result:

error: calling a private constructor of class 'Point'    Point p1 = p; //初始化操作               ^test_error_copy_construct.cpp:17:12: note: declared private here           Point(const Point &p);           ^

这个时候就会报错,因为需要调用复刻构造函数,但是它没有实现

tips:有如下来两种情况,只能用初始化,而不用赋值

1.对于const和reference 类型的成员变量,只能用初始化列表形式

2.类的构造函数需要调用基类的构造函数的时候

构造函数与赋值函数的区别

1.复刻构造函数是一个对象来初始化一块内存区域,这块内存就是新对象的内存区

2.复刻构造函数式复制指针对象,赋值函数是引用指针对象

3.实现方式不一样,复刻构造函数首先是一个构造函数,它调用的时候好似通过参数传进来的那个对象来初始化一个对象,赋值函数就是一个已经初始化的对象来进行operator=操作

来源:https://www.icode9.com/content-4-806801.html

(0)

相关推荐