C++--day05

目錄:?
1. C的提高 1-131P 時間七天?
2. C++的基礎 132-286P 時間八天?
3. C++的提高 287-378P 時間五天?
4. C/C++的數據結構 379-482P 時間五天?
5. C/C++的設計模式基礎 483-540P 時間三天

?

視頻資料:https://www.bilibili.com/video/av27904891?from=search&seid=10891514449061956870


P171 構造和析構的基礎知識

構造函數

1、構造函數定義及調用

  1)C++中的類可以定義與類名相同的特殊成員函數,這種與類名相同的成員函數叫做構造函數;

  2)構造函數在定義時可以有參數;

  3)沒有任何返回類型的聲明。

2、構造函數的調用

  自動調用:一般情況下C++編譯器會自動調用構造函數

  手動調用:在一些情況下則需要手工調用構造函數

?

析構函數

1、析構函數定義及調用

  1)C++中的類可以定義一個特殊的成員函數清理對象,這個特殊的成員函數叫做析構函數

    語法:~ClassName()

  2)析構函數沒有參數也沒有任何返回類型的聲明

  3)析構函數在對象銷毀時自動被調用

  4)析構函數調用機制

2、C++編譯器自動調用

?

#include<iostream>
using namespace std;class Test
{
public:Test()//無參數 構造函數
    {cout<<"我是構造函數"<<endl;}~Test()//析構函數
    {cout<<"我是析構函數"<<endl;}
private:
};//給對象搭建一個舞臺,研究對象的行為
void objplay()
{//先創建的對象后釋放
    Test t1;Test t2;
}void main()
{objplay();system("pause");
}

?


?P172? 構造和析構的用途演示

#include<iostream>
using namespace std;class Test
{
public:Test()//無參數 構造函數
    {a=10;//作用:完成對屬性的初始化工作p=(char *)malloc(100);strcpy(p,"aaa");cout<<"我是構造函數"<<endl;}void printfP(){cout<<p<<endl;cout<<a<<endl;}~Test()//析構函數
    {if (p!=NULL){free(p);}cout<<"我是析構函數"<<endl;}
private:int a;char *p;
};//給對象搭建一個舞臺,研究對象的行為
void objplay()
{//先創建的對象后釋放
    Test t1;t1.printfP();printf("分隔符\n");Test t2;t2.printfP();
}void main()
{objplay();system("pause");
}

?

?輸出結果

?


?P173? 構造函數的調用(無參數和有參調用)

#include<iostream>
using namespace std;class Test2
{
public:Test2() //無參數構造函數
    {m_a=0;m_b=0;cout<<"無參數構造函數"<<endl;}Test2(int a)//有參數構造函數
    {m_a=a;m_b=0;cout<<"a:"<<m_a<<endl;printf("這是等號構造函數\n");}Test2(int a,int b)//有參數構造函數
    {m_a=a;m_b=b;cout<<"有參數構造函數"<<endl;}//賦值構造函數(copy構造函數)Test2(const Test2 &obj){cout<<"我也是構造函數"<<endl;}
public:void printT(){cout<<"普通成員函數"<<endl;}
private:int m_a;int m_b;
};//調用有參數構造函數3種方法
void main()
{//Test2 t1;//調用無參數構造函數//1. 括號法Test2 t1(1,2);//C++編譯器自動的調用構造函數
    t1.printT();//2. c++對=操作符進行了功能增強 Test2 t2=(3,4,5);Test2 t3=5;//3. 直接調用構造函數 手動的調用構造函數Test2 t4=Test2(1,2);//匿名對象(匿名對象的去和留)
system("pause");
}

?

?輸出結果:

?


P175? 為什么需要構造和析構函數

1、構造函數的調用方法:自動調用(按照規則調用)

2、顯示的初始化類的屬性或其他資源

#include<iostream>
using namespace std;class Test3
{
public:void init(int _a,int _b){a=_a;b=_b;}
protected:
private:int a;int b;
};void main()
{//類沒有提供構造函數 C++編譯器會自動給你提供一個默認的構造函數//類沒有提供copy構造函數 C++編譯器會自動給你提供一個默認的copy構造函數
    Test3 t1;t1.init(2,3);Test3 tArray[3];tArray[0].init(1,2);tArray[1].init(1,2);tArray[2].init(1,2);//在這種場景之下 顯示的初識化方案顯得很蹩腳Test3 t21;t21.init(1,2);Test3 t22;t22.init(1,2);Test3 t23;t23.init(1,2);Test3 tArray2[3]={t21,t22,t23};//在這種場景下 滿足不了編程需要//Test3 tArray2[1999]={t21,t22,t23};
system("pause");
}

?


?P176? copy構造函數調用時機1和2

#include<iostream>
using namespace std;class Test4
{
public:Test4() //無參數構造函數
    {m_a=0;m_b=0;cout<<"無參數構造函數"<<endl;}Test4(int a)//有參數構造函數
    {m_a=a;m_b=0;cout<<"a:"<<m_a<<endl;printf("這是等號構造函數\n");}Test4(int a,int b)//有參數構造函數
    {m_a=a;m_b=b;cout<<"有參數構造函數"<<endl;}//賦值構造函數(copy構造函數)Test4(const Test4 &obj){cout<<"我也是構造函數"<<endl;m_b=obj.m_b+100;m_a=obj.m_a+100;}
public:void printT(){cout<<"普通成員函數"<<endl;cout<<"m_a:"<<m_a<<endl;}
private:int m_a;int m_b;
};//1. 賦值構造函數 用1個對象去初始化另外一個對象
void main_number1()
{Test4 t1(1,2);Test4 t0(1,2);t0=t1;//用t1給t0 賦值操作和初始化是兩個不同的概念//第一種 調用方法Test4 t2=t1;//用t1初始化t2
    t2.printT();system("pause");
}
//2. 第二種調用時機
void main()
{Test4 t1(1,2);Test4 t0(1,2);Test4 t2(t1);//用t1對象初始化t2對象
    t2.printT();
}

?


?P178? ?copy構造函數調用時機3

#include<iostream>
using namespace std;class Location 
{ 
public:Location( int xx = 0 , int yy = 0 ) { X = xx ; Y = yy ;  cout << "Constructor Object.\n"<<endl ; }Location( const Location & p )         //拷貝構造函數 完成對象的初始化
    { X = p.X ; Y = p.Y ;   cout << "Copy_constructor called." << endl ;  }~Location() { cout << X << "," << Y << " Object destroyed." << endl ; }int  GetX () { return X ; }        int GetY () { return Y ; }
private :   int  X , Y ;
} ;//業務函數  形參是一個元素
void f ( Location  p )   
{ cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl ; 
}void mainobjplay()
{  Location a(1,2);Location b=a;  //形參是一個元素,函數調用,會執行實參變量初始化形參變量
f(b);//b實參去初始化形參p,會調用copy構造函數
} void main()
{  mainobjplay();system("pause");
}

?輸出結果:

?

轉載于:https://www.cnblogs.com/yangyuqing/p/10402295.html

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

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

相關文章

通過 CancellationToken 提高 Web 性能

在 Web 開發中&#xff0c;經常會遇到這樣的場景&#xff1a;用戶發起一個請求&#xff0c;Web 服務器執行一些計算密集型的操作&#xff0c;等待結果返回給用戶。這種情況下&#xff0c;如果用戶在等待結果的過程中取消了請求&#xff0c;那么服務器端依然會繼續執行計算&…

libreoffice_如何更改您在LibreOffice中可以撤消的操作數

libreofficeIn LibreOffice programs, you can undo one action after another…to a point. The default number of actions you can undo is 100, but that number is easy to change. 在LibreOffice程序中&#xff0c;您可以撤消一個動作&#xff0c;直到某個點。 您可以撤消…

遠程連接服務器出現身份驗證錯誤 要求的函數不受支持

來源&#xff1a;https://www.cnblogs.com/lindajia/p/9021082.html 以往發布程序到服務器都沒問題。今天遠程桌面連接到服務器&#xff0c;突然出現了異常&#xff01;異常信息為&#xff1a; 在網上看到有多種解決方案&#xff1a;發現有種修改注冊表的方式很簡單。 詳細步驟…

截取圖片生成頭像插件

上傳頭像插件 目的&#xff1a; 幫助開發者快速開發上傳頭像功能點 背景&#xff1a; 現在b&#xff0c;g能搜到的頭像上傳插件并不太好用&#xff0c;所以想提供一個比較自由度的上傳并且可以剪切的插件。 資源&#xff1a; 具體資源請查看這里 實現大致思路如下&#xff1a; …

CDH集群安裝配置(五)- Cloudera Manager Server

在線安裝 sudo yum install cloudera-manager-daemons cloudera-manager-server 離線安裝 資源下載地址 https://archive.cloudera.com/cm6/6.1.0/redhat7/yum/RPMS/x86_64/ 上次下面資源包到cdh1節點 cloudera-manager-server-6.1.0-769885.el7.x86_64.rpm cloudera-manager-s…

c++簡單程序設計-5

編程實驗部分1.vector3.cpp #include <iostream> #include <vector> #include <string> using namespace std;// 函數聲明 void output1(vector<string> &); void output2(vector<string> &); int main() {vector<string>like…

關于JavaScript的編譯原理

引擎&#xff1a;負責整個js程序的編譯和執行過程編譯器&#xff1a;負責語法分析和代碼生成作用域&#xff1a;收集和維護一系列查詢&#xff08;由所有聲明的標識符組成&#xff09; 【例子&#xff1a;聲明一個變量并賦值 var a value&#xff1b;】 Step1.編譯器對該程序段…

safari檢查元素_如何防止Safari檢查是否使用Apple Pay

safari檢查元素Apple Pay’s incorporation into macOS Sierra makes it really easy to pay using the service on your Mac with your iPhone or iPad. But that doesn’t mean just because you can, you will, or will want to use Apple Pay in the future. 通過將Apple P…

spring boot中servlet啟動原理

啟動過程及原理 1 spring boot 應用啟動運行run方法 StopWatch stopWatch new StopWatch();stopWatch.start();ConfigurableApplicationContext context null;FailureAnalyzers analyzers null;configureHeadlessProperty();SpringApplicationRunListeners listeners getRu…

某乎有人問--微軟會拋棄C#嗎,有點擔心?

在某乎有人問&#xff1a;微軟會拋棄C#嗎&#xff0c;有點擔心&#xff1f;&#xff0c;類似這樣的問題&#xff0c;一直都有很多人在問&#xff0c;今天我們就來聊聊這個問題。沒必要擔心微軟倒閉了&#xff0c;C#都不會消失&#xff0c;其實.Net已經不屬于微軟的了。C#是屬于…

mailing list的原理

1 發往mailing list郵箱的郵件會被所有訂閱了該郵箱的人收到 說白了&#xff0c;就是一種郵件群發機制&#xff0c;為了簡化群發&#xff0c;不是將所有的收件人放到收件人列表中&#xff0c;而是發往總的郵箱即可。 2 要向該mailing list郵箱中發送郵件需要先要訂閱 但是&…

icloud上傳錯誤_如何修復HomeKit“地址未注冊到iCloud”錯誤

icloud上傳錯誤While Apple has made serious improvements to the HomeKit smarthome framework, there are still more than a few ghosts in the machine. Let’s look at how to banish the extremely frustrating “Address is not registered with iCloud” error to get…

Jenkins安裝部署

Jenkins安裝部署 Jenkins簡介 Jenkins是一個開源軟件項目&#xff0c;是基于Java開發的一種持續集成工具&#xff0c;用于監控持續重復的工作&#xff0c;旨在提供一個開放易用的軟件平臺&#xff0c;使軟件的持續集成變成可能。 安裝步驟 本文以CentOS7為環境&#xff0c;安裝…

Angular2中的路由(簡單總結)

Angular2中建立路由的4個步驟&#xff1a; 1、路由配置&#xff1a;最好新建一個app.toutes.ts文件&#xff08;能不能用ng命令新建有待調查&#xff09; Angular2中路由要解決的是URL與頁面的對應關系&#xff08;比如URL是http://localhost:4200/all-people&#xff0c;那么頁…

受 SQLite 多年青睞,C 語言到底好在哪兒?

SQLite 近日發表了一篇博文&#xff0c;解釋了為什么多年來 SQLite 一直堅持用 C 語言來實現&#xff0c;以下是正文內容&#xff1a; C 語言是最佳選擇 從2000年5月29日發布至今&#xff0c;SQLite 一直都是用 C 語言實現。C 一直是實現像 SQLite 這類軟件庫的最佳語言。目前&…

為什么 Random.Shared 是線程安全的

在多線程環境中使用 Random 類來生成偽隨機數時&#xff0c;很容易出現線程安全問題。例如&#xff0c;當多個線程同時調用 Next 方法時&#xff0c;可能會出現種子被意外修改的情況&#xff0c;導致生成的偽隨機數不符合預期。為了避免這種情況&#xff0c;.NET 框架引入了 Ra…

(3)Python3筆記之變量與運算符

一、變量 1&#xff09;. 命名規則&#xff1a; 1. 變量名不能使用系統關鍵字或保留關鍵字 2. 變量區分大小寫 3. 變量命名由字母&#xff0c;數字&#xff0c;下劃線組成但不能以數字開頭 4. 不需要聲明變量類型 是 a 1 非 int a 1 5. 查看變量內存地址 id(a), id(b) 6…

some demos

import ../css/detail.css;// 找到字符串中重復次數最多的字符 function findMax(str) {let maxChar ;let maxValue 1;if (!str.length) return;let arr str.replace(/\s/g, ).split();let obj {};for (let i 0; i < arr.length; i) {if (!obj[arr[i]]) {obj[arr[i]] …

WPF 實現視頻會議與會人員動態布局

WPF 實現視頻會議與會人員動態布局控件名&#xff1a;SixGridView作 者&#xff1a;WPFDevelopersOrg - 驚鏵原文鏈接[1]&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET40&#xff1b;Visual Studio 2019;接著上一篇是基于Grid實現的視頻查看感…