C++初始化和赋值的区别

普通情况下,初始化和赋值好像没有什么特别去区分它的意义。

int a=100;和int a;a=100间仿佛没有任何区别,但是当c++中引入类后,情况变得有些复杂。

首先理清下构造函数的一些东西。

关于构造函数,前面有两篇随笔写了默认构造函数和拷贝构造函数,其实还包括参数为一些成员变量属性的构造函数,现在自己理一下,这两个东西,他们只是参数不同,也就是说只是使用他们的方式不同。默认构造函数是不传参,构建的对象默认的使用那些值赋值给成员变量;而拷贝构造函数是接受一个相同类的另一个对象,使用该对象来逐成员的为自己的成员赋值;其他的一些构造函数也是如此,他们只是走的路线不同,最终目的都是为构建的一个对象进行初始化。

也就是说,构造函数的目的,是服务于类的初始化的,它并不服务于赋值。赋值是独立于初始化之后的操作。

这么讲比较抽象,举一个栗子:

例子转自:https://blog.csdn.net/qq_38211852/article/details/80629691

#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;  
};  
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;   


这个类重载了“=”号。重点在于main函数中。

从结果我们观察到:

并不像我们想象的那样p1为(2,2),p2也为(2,2)。

这正是初始化与赋值的区别。

在p1中,Point p1=p;这个操作中,实际上是通过一种类似于拷贝构造函数中逐member的方式(但并没有生成一个拷贝构造函数,生成拷贝构造函数的四种情况见前面的随笔),并没有调用重载的"="运算符。所以最终结果是p1为(1,1)。

而在p2中,初始化与赋值是分开的,Point p2;就已经完成了初始化,这个初始化是通过定义的含参构造函数(但是以a=0,b=0的默认值完成的)。

然后在调用重载运算符,对p中成员均自加后赋值给p2的成员变量。

原文地址:https://www.cnblogs.com/lxy-xf/p/11049963.html