普通情況下,初始化和賦值好像沒有什么特別去區分它的意義。
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的成員變量。