日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++网易云课堂开发工程师-拷贝构造,拷贝复制,析构函数

發(fā)布時間:2025/3/15 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++网易云课堂开发工程师-拷贝构造,拷贝复制,析构函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.帶有指針的ClassClass with pointer member

當類內(nèi)帶指針,一定自己寫出拷貝構造函數(shù)。

String s1();

String s2("hello");

String s3(s1);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 拷貝構造

s3=s2;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 拷貝賦值

往往編譯器會自動完成拷貝構造拷貝賦值,不帶有指針的可以一個數(shù)據(jù)成員一個數(shù)據(jù)成員的賦值。

但是帶有指針時,會出現(xiàn)不同的效果。

2.Class String

class String{

public:

  String(const char* cstr = 0);

  String(const String& str);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 接受自己本身,我們稱之為拷貝構造

  String& operator = (const String& str);? ? ? ? ? ? ? 拷貝賦值

  ~String();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?析構函數(shù)

  char* get_c_str() const {return m_data;}

private:

  char* m_data;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

}

3.ctor和dtor(構造函數(shù)和析構函數(shù))

inline

String::String(const char* cstr = 0){

  if(cstr){

    m_data = new char[strlen(cstr) + 1];

    strcpy(m_data, cstr);

  }

  else{? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?未定義初值

    m_data = new char[1];

    *m_data = '\0';

  }

}

?

inline? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 做動態(tài)分配后,一定要釋放掉

String::~String(){

  delete[] m_data;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 搭配中括號的delete

}

4.類的創(chuàng)建與調(diào)用

{

  String s1();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

  String s2("hello");? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 離開作用域后,析構函數(shù)自然而然會被調(diào)用

  String* p = new String("hello");

  delete p;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?必須使用delete搭配刪除

}

~~~~~~~~~~~一共要調(diào)用三次析構函數(shù)~~~~~~~~~~~~~

5.class with pointer members 必須有copy ctor copy op=

String a("hello");? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 對應的是? ? ? ? ? ? ? ? ? ? ? ? ? ? ? a---------->Hello\0

String b("World");? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?對應的是? ? ? ? ? ? ? ? ? ? ? ? ? ? ? b---------->World\0

使用default copy ctor 或者 default op= 會造成以下局面

a--------------->Hello\0<------------------b? ? ? ? ? ?World\0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 淺拷貝

~~~~~~~必須完成深拷貝,主要是通過創(chuàng)建數(shù)據(jù)副本~~~~~~~~~

inline

String::String(const String& str){

  m_data = new char[strlen(str.m_data) + 1];? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?創(chuàng)建數(shù)據(jù)副本

  strcpy(m_data, str.m_data);

}

~~~拷貝賦值,因為當前創(chuàng)建空間所以一定要清空自己,而后進行賦值~~~

~~~拷貝構造不需要完成清空自己是因為它剛剛創(chuàng)建出來的~~~~~~~~

inline

String& String::operator= (const String& str){

  if(this == &str){? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 檢測自我賦值/如果這兩行沒有寫檢測,甚至會造成結(jié)果出錯。

    return *this;

  }

  delete[] m_data;

  m_data = new char[strlen(str.m_data) + 1];

  strcpy(m_data,? str.m_data);

  return *this;

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

如果if語句沒有寫,會造成自己銷毀自己,而不會完成賦值操作。

轉(zhuǎn)載于:https://www.cnblogs.com/sky-z/p/9505750.html

總結(jié)

以上是生活随笔為你收集整理的C++网易云课堂开发工程师-拷贝构造,拷贝复制,析构函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。