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的成員變量。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM