菜鸟笔记
提升您的技术认知

c 初始化和赋值的区别-ag真人游戏

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

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

#include
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;  
};  
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 = "<

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

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

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

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

class empty{};

就好像你写下如下代码:

class empty{

    public :

        empty(){..}

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

        ~empty() {...}

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

}

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

#include
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 = "<

网站地图