C++(18)--復制構造函數

復制構造函數


《老九學堂C++課程》《C++ primer》學習筆記。《老九學堂C++課程》詳情請到B站搜索《老九零基礎學編程C++入門》
-------------簡單的事情重復做,重復的事情用心做,用心的事情堅持做(老九君)---------------

包裝基本類,封裝一些算法。
需求說明:自定義String類,以簡化字符串的操作。

//main.cpp
#include <iostream>
#include "MyString.h"
using namespace std;
void TestString(){String str1("abc");//String str2="abcdefg";   // 尋找帶char * 參數的構造--轉換構造String str2(str1);         // 如此指向同一個內存空間,需要復制構造函數cout << str1 << endl;cout << str2 << endl;cout << "對象之間的賦值"<< endl;str1 = str2;    // 指向同一個地址,需要重載= 預算符// 為啥他把地址也給打出來了cout << str1 << endl;cout << str2 << endl;
}
int main() {//TestIntefer();TestString();return 0;
}
//MyString.h
//
// Created by 陳瑩瑩 on 2021/3/4.
// 自定義的字符串包裝類#ifndef CHAPTER12_MYSTRING_H
#define CHAPTER12_MYSTRING_H
#include <iostream>
#include <cstring>using namespace std;class String {
public:String();String(char * str);String(const String & str); // 參數是引用,所以是復制構造/拷貝構造~String();friend ostream & operator<<(ostream & out, const String & str);// 重載復制運算符,將數組中的每個元素都進行復制,而不是只復制數組指針const String & operator=(const String & str);
private:int m_length;   // 字符串的實際長度-不包括\0char * m_value;  // 實際存儲字符的字符數組,指針好用};#endif //CHAPTER12_MYSTRING_H
//MyString.cpp
//
// Created by 陳瑩瑩 on 2021/3/4.
//#include "MyString.h"
String::String() :m_length(0)
{this->m_value = new char[m_length + 1];this->m_value[0] = '\0';// 等價于// char * str = ""; 長度為0,但實際的字符數組中會存在唯一元素:\0--結束符號
}
String::String(char * str) {if(NULL == str){this->m_value = new char[m_length + 1];this->m_value[0] = '\0';return;}// 將傳入的字符串str的值賦給當前對象中的m_valuem_length = strlen(str); // 要復制字符串的長度m_value = new char[m_length + 1];strcpy(m_value, str);
}
String::String(const String & str){// 重載復制運算符,就一定要拷貝構造m_length= str.m_length;m_value = new char[m_length + 1];strcpy(m_value, str.m_value);
}
ostream & operator<<(ostream & out, const String & str)
{out << str.m_value<<"\n";// out <<  "m_value的長度:" << strlen(str.m_value);out <<  "m_value的長度:" << str.m_length;return out;
}
// 當重載賦值運算符,務必確定將一個對象中的所有數據都復制到另一對象中(特別是有指針時)
// 如果包含多個成員,那么每個成員都需要復制到內存對象中-深復制
// 如果一個類擁有指針類型的成員,那么大部分情況下都需要深賦值,才能將指針指向的內容復制一份出來,讓原來的額對象和新對象相互獨立
// 如果類的成員沒有指針,一般淺賦值即可
const String & String::operator=(const String & str){if(this == &str) return *this;delete[] m_value; // 首先要釋放字符串原始空間m_length = str.m_length;m_value = new char[m_length + 1];strcpy(m_value, str.m_value);return *this;
}
String::~String()
{// 析構時,釋放字符數組所指向的空間delete[] m_value;
}

情況1:不重載運算符,對象str1的內容直接復制到新對象str2中,對于沒有指針的簡單類來說,這就足夠了。當成員包含指針時,逐字節的復制將會把指針從一個對象復制給另一個對象,兩個指針就指向同一個內存
解決方案:重載賦值運算符號

String str1 = "愛吃新紅柿";
String str2;
str2 = str1;

情況2:使用一個類對象去初始化另一個對象,也會出現兩個指針指向同一塊內存地址的問題。
解決方案:復制構造函數(以對象為引用為參數的構造函數)

xxx::xxx(xxx & xxxptr);
xxx::xxx(const xxx & xxxptr); // const 保證復制過程中不會改變被復制對象

String str1("愛吃新紅柿");
String str2(str1);
str2 = str1;

需要使用復制構造函數的三種情況

  1. 當類對象被初始化為同一類的另一個對象時
  2. 當對象被作為參數傳遞給一個函數時
  3. 當函數返回一個對象時
String str = "abc";
test(str); // 按副本傳遞,默認調用復制構造,如果沒有實現復制構造的話,會調用淺復制(指向同一塊內存地址)
viod test(String str){}
String test(String str){	String str1 = "abc";return str1;  // 需要寫復制構造函數
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444794.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444794.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

lua與C++粘合層框架

一. lua調用C 在lua中是以函數指針的形式調用函數, 并且所有的函數指針都必須滿足如下此種類型: typedef int (*lua_CFunction) (lua_State *L);   也就是說, 偶們在C中定義函數時必須以lua_State為參數, 以int為返回值才能被Lua所調用. 但是不要忘記了, 偶們的lua_State是…

leetcode147 對鏈表進行插入排序

丟人&#xff0c;我就是按插入排序老老實實寫的啊。。。。 別人肯定map了hhh。 對鏈表進行插入排序。 插入排序的動畫演示如上。從第一個元素開始&#xff0c;該鏈表可以被認為已經部分排序&#xff08;用黑色表示&#xff09;。 每次迭代時&#xff0c;從輸入數據中移除一個…

PaperNotes(13)-Conditional Image Generation with PixelCNN Decoders

conditional Image generation with PixelCNN DecodersICML的best paperpixel cnn 屬于完全可見的信念網絡&#xff0c;需要對 概率密度 建模。給定圖像數據x&#xff0c;想要對概率分布p(x)建模。概率分布p(x)可以看做&#xff0c;每一像素分布同時作用結果的一個聯合分布。一…

Expression : invalid operator 解決方法

從技術上說&#xff0c;用于排序關聯容器的比較函數必須在它們所比較的對象上定義一個“嚴格的弱序化(strict weak ordering)”。&#xff08;傳給sort等算法的比較函數也有同樣的限制&#xff09;,就是兩個對象比大小或先后的規則&#xff0c;比如兩個 string對象比大小的規則…

leetcode23 合并K個排序鏈表

合并 k 個排序鏈表&#xff0c;返回合并后的排序鏈表。請分析和描述算法的復雜度。 示例: 輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出: 1->1->2->3->4->4->5->6 思路&#xff1a;把初始的每一個鏈表當成數組中的一個數&#xff0c;做…

Xcode LaunchImage 載入界面大小設置

iPhone Portrait iOS 8-Retina HD 5.5 (12422208) @3x iPhone Portrait iOS 8-Retina HD 4.7 (7501334) @2x iPhone Portrait iOS 7,8-2x (640960) @2x iPhone Portrait iOS 7,8-Retina 4 (6401136) @2x iPhone Portrait iOS 5,6-1x (320480) @1x iPhone Portrait iO…

leetcode237 刪除鏈表中的節點(你意想不到的做法,注意細節)

請編寫一個函數&#xff0c;使其可以刪除某個鏈表中給定的&#xff08;非末尾&#xff09;節點&#xff0c;你將只被給定要求被刪除的節點。 現有一個鏈表 -- head [4,5,1,9]&#xff0c;它可以表示為: 示例 1: 輸入: head [4,5,1,9], node 5 輸出: [4,1,9] 解釋: 給定你鏈…

cppcheck值得注意的一些篩選項

使用完cppcheck進行C代碼檢測之后&#xff0c;可能篩選起來很麻煩&#xff0c;一般常見的優化有 emptiness&#xff0c;就是當你使用stl的時候&#xff0c;最好用empty替代size 還有就是 leak

C++(19)--自定義Array,vector練習

自定義Array,vector1.自定義Array2.自定義vector《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)---------------1.自定義…

讓cocos2dx支持并通過arm64 編譯

為了要支持64位,請把這個文件直接替換到對應的lib目錄下,本來是需要改neton_matrix_impl.c里的宏定義, 在 platform/ios/EAGLVIEW.mm中 在neon_matrix_impl.c中修改 #if defined(__ARM_NEON__) 為#if defined(_ARM_ARCH_7) 還有 third_party目錄下的curl的支持。

springboot——概述

Spring Boot 介紹 Spring Boot 是由 Pivotal 團隊提供的全新框架&#xff0c;其設計?的是?來簡化新 Spring 應? 初始搭建以及開發過 程&#xff0c;該框架使?了特定的?式來進?配置&#xff0c;從?使開發?員不再需要定義樣板化的配置。 默認配置了很多框架的使??式…

C++(20)--類型自動轉換

類型自動轉換1.C內置類型轉換2.實現自定義類的類型轉換《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》 -------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)---------------…

關于遍歷linux的文件目錄的坑- readdir

去年給公司寫了一個配置服務器,目的是解決運維的工作量太大,而且傳送服務器需要的配置文件需要腳本傳送到各個服(每個服ip不一樣,需要scp),然后再刷新通知各個GameServer,中間有沒有傳送失敗并不得知,而且維護相當麻煩,所以我寫了這個服務器,所有區服的配置都在這里邊…

終于,我讀懂了所有Java集合——sort

Collections.sort 事實上Collections.sort方法底層就是調用的Arrays.sort方法&#xff0c;而Arrays.sort使用了兩種排序方法&#xff0c;快速排序和優化的歸并排序。 快速排序主要是對那些基本類型數據&#xff08;int,short,long等&#xff09;排序&#xff0c; 而歸并排序用于…

PRML(1)--緒論(上)多項式曲線擬合、概率論

PRML緒論1.1 多項式曲線擬合1.1.1 問題描述1.1.2 最小化平方和誤差1.1.3 多項式階數確定1.1.4 有趣問題--高階模型為什么效果不好1.1.4 數據集規模對模型的影響1.1.5 參數正則化緩解過擬合問題1.2 概率論1.2.1離散型隨機變量1.2.2 連續型隨機變量1.2.3 期望和方差1.2.4 貝葉斯概…

大數加減乘

如標題&#xff0c;不解釋。 加 #include<stdio.h> #include<string.h> int main() {char a[1000],b[1000];int i,s[1000],len1,len2,len,j;while(scanf("%s%s",a,b)!EOF) //用字符數組來儲存數{for(i0;i<1000;i)s[i]0;len1strlen(a);len2strlen(b…

在GCC和Visual Studio中使用hash_map

熟悉STL或熟悉ACM/ICPC的話&#xff0c;其中的set, map, multiset, multimap一定用過無數次了&#xff0c;它們都是用平衡二叉樹&#xff08;紅黑樹&#xff09;實現的&#xff0c;復雜度為O(lgn)。我們也知道set, map可以通過哈希來實現&#xff0c;復雜度只有O(1)&#xff0c…

C++(21)--Astah uml 畫C++類圖

Astah uml 畫C類圖1.安裝2.使用《老九學堂C課程》《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)--------------- ASTAH&#xff1a;類圖工具&#xff0c;用于理…

redis3.0.0 集群安裝詳細步驟

Redis集群部署文檔(centos6系統) &#xff08;要讓集群正常工作至少需要3個主節點&#xff0c;在這里我們要創建6個redis節點&#xff0c;其中三個為主節點&#xff0c;三個為從節點&#xff0c;對應的redis節點的ip和端口對應關系如下&#xff09; 127.0.0.1:7000 127.0.0.1:7…

Redis集群添加節點

Redis集群添加節點 1&#xff1a;首先把需要添加的節點啟動 cd /usr/local/cluster/ mkdir 7006 cp /usr/local/cluster/redis.conf /usr/local/cluster/7006/ cd /usr/local/cluster/7006/ vi redis.conf ##修改redis.conf中的port參數的值為7006 redis-server redis.c…