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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++基础学习笔记 day03

發布時間:2023/12/14 c/c++ 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++基础学习笔记 day03 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.?設計立方體類

設計立方體類(Cube),求立方體的面積(2*a*b + 2*a*c + 2*b*c)和體積(a*b*c),分別用全局函數和成員函數判斷兩個立方體是否相等?

#include <iostream> using namespace std;/* 設計立方體類(Cube) 求立方體的面積(2*a*b + 2*a*c + 2*b*c)和體積(a*b*c) 分別用全局函數和成員函數判斷兩個立方體是否相等? */class Cube { public:// 設置長寬高void setL(int l){m_L = l;}void setW(int w){m_W = w;}void setH(int h){m_H = h;}// 獲取長寬高int getL(){return m_L;int getW(){return m_W;}int getH(){return m_H;}// 求立方體的面積void getCubeS(){int S = 2*m_L*m_W + 2*m_L*m_H + 2*m_W*m_H;cout << "立方體的面積為:" << S << endl;}// 求立方體的體積void getCubeV(){int V = m_L*m_W*m_H;cout << "立方體的體積為:" << V << endl;}// 通過成員函數判斷是否相等bool compareCubeByClass( Cube &cub ){bool ret = ( cub.getL() == m_L && cub.getW() == m_W && cub.getH() == m_H );return ret;}private:int m_L; // 長int m_W; // 寬int m_H; // 高 };// 全局函數判斷 兩個立方體是否相等 bool compareCube( Cube &cub1, Cube &cub2 ) {if( cub1.getL() == cub2.getL() && cub1.getW() == cub2.getW() && cub1.getH() == cub2.getH() ){return true;}return false; }void test01() {Cube c1;c1.setL(10);c1.setW(10);c1.setH(10);c1.getCubeS(); // 600c1.getCubeV(); // 1000// 通過全局函數判斷兩個立方體是否相等Cube c2;c2.setL(10);c2.setW(10);c2.setH(10);bool ret = compareCube( c1, c2 );if( ret == true ){cout << "c1和c2兩個立方體相等" << endl;}else{cout << "c1和c2兩個立方體不相等" << endl;}// 通過成員函數判斷兩個立方體是否相等bool ret2 = c1.compareCubeByClass( c2 );if( ret2 == true ){cout << "通過成員函數:c1和c2兩個立方體相等" << endl;}else{cout << "通過成員函數:c1和c2兩個立方體不相等" << endl;} }int main() {test01();return 0; }

?

2.?對象的構造和析構?

對象的初始化清理

  • 構造函數:沒有返回值,沒有void,類名相同,可以發生重載,可以有參數
  • 析構函數:沒有返回值,沒有void,函數名稱:~類名,不可以發生重載,不可以有參數
  • 系統會默認調用?構造函數和析構函數,而且只會調用一次。

    如果程序員沒有提供構造和析構,系統會默認提供,空實現。

    ?構造函數的分類:

    • 按照參數進行分類:無參構造函數(默認構造函數)、有參構造函數
    • 按照類型進行分類:普通構造函數、拷貝構造函數
    class Person {public: // 構造和析構必須寫在pubilc下才可以調用Person(){cout << "默認構造函數調用" << endl;}Person(int a){cout << "有參構造函數調用" << endl;}// 拷貝構造函數Person(const Person &p){m_Age = p.m_Age;cout << "拷貝構造函數調用" << endl;}~Person(){cout << "析構函數調用" <<endl;}int m_Age; };void test01() {// 構造函數調用方式// 括號法:Person p1(1); // 有參p1.m_Age = 10;Person p2(p1); // 拷貝cout << "p2的年齡:" << p2.m_Age << endl;Person p3; // 默認構造函數 不要加()// Person p3(); // 編譯器認為這是函數的聲明// 顯示法:Person p4 = Person(100);Person p5 = Person(p4);// Peson(100) 叫匿名對象,匿名對象特定,如果編譯器發現了對象是匿名的,那么這行代碼結束后就釋放這個對象}

    ?

    3.?初始化列表

    include <iostream> using namespace std;class Person { public:// 有參構造函數 初始化數據/*Person( int a, int b, int c ){m_A = a;m_B = b;m_C = c;}*/// 利用初始化列表 初始化數據// 構造函數后面 :屬性(參數),屬性(參數)...Person(int a, int b, int c):m_A(a),m_B(b),m_C(c){}int m_A;int m_B;int m_C; };void test01() {Person p1(10,20,30);cout << "p1的m_A:" << p1.m_A << endl;cout << "p1的m_B:" << p1.m_B << endl;cout << "p1的m_C:" << p1.m_C << endl; }int main() {test01();return 0; }

    初始化列表語法:

    在構造函數后面 :屬性(值/參數),屬性(值/參數)...

    ?

    4.?類對象作為成員

    #include <iostream> using namespace std;class Phone { public:Phone(){cout << "手機的默認構造函數調用" << endl;}Phone(string name){m_PhoneName = name;}~Phone(){cout << "手機的析構函數調用" << endl;}string m_PhoneName; };class Game { public:Game(){cout << "Game的默認構造函數調用" << endl;}Game(string name){m_GameName = name;}~Game(){cout << "Game的析構函數調用" << endl;}string m_GameName; };class Person { public:Person(){cout << "Person的默認構造函數調用" << endl;}~Person(){cout << "Person的析構函數調用" << endl;}Person(string name){m_Name = name;}string m_Name; // 姓名Phone m_Phone; // 手機Game m_Game; // 游戲 };void test01() {Person p;p.m_Phone.m_PhoneName = "三星";p.m_Game.m_GameName = "斗地主"; }int main() {test01();return 0; }

    類對象作為類成員時候,構造順序先將對象一一構造然后再構造自己,析構函數順序相反。

    #include <iostream> using namespace std;class Phone { public:Phone(){cout << "手機的默認構造函數調用" << endl;}Phone(string name){cout << "手機的有參構造函數調用" << endl;m_PhoneName = name;}~Phone(){cout << "手機的析構函數調用" << endl;}string m_PhoneName; };class Game { public:Game(){cout << "Game的默認構造函數調用" << endl;}Game(string name){cout << "Game的有參構造函數調用" << endl;m_GameName = name;}~Game(){cout << "Game的析構函數調用" << endl;}string m_GameName; };class Person { public:Person(){cout << "Person的默認構造函數調用" << endl;}~Person(){cout << "Person的析構函數調用" << endl;}Person(string name, string phoneName, string gameName) : m_Name(name), m_Phone(phoneName), m_Game(gameName){cout << "Person的有參構造函數調用" << endl;//m_Name = name;}void playGame(){cout << m_Name << "玩" << m_Phone.m_PhoneName << "牌的" << m_Game.m_GameName << "游戲" << endl;}string m_Name; // 姓名Phone m_Phone; // 手機Game m_Game; // 游戲 };void test01() {Person p("狗蛋","蘋果","王者榮耀");//p.m_Phone.m_PhoneName = "三星";//p.m_Game.m_GameName = "斗地主";p.playGame(); }int main() {test01();return 0; }

    ?當類對象作為類的成員時候,構造順序是先構造類對象的構造,然后構造自己

    析構順序與構造相反

    ?

    4.?對象創建

    C語言中malloc:

  • 程序員必須確定對象的長度;
  • malloc返回一個void *指針,C++不允許將void *賦值給其他任何指針,必須強轉;
  • malloc可能申請內存失敗,所以必須判斷返回值來確保內存分配成功
  • 用戶在使用對象之前必須記住對它的初始化,構造函數不能顯示調用初始化(構造函數是由編譯器調用),用戶有可能忘記調用初始化函數。
  • 4.1?new?運算符

    C++解決動態內存分配的方案是把創建一個對象所需的操作都結合在一個稱為new運算符里。

    當用new創建一個對象時,它就在堆里為對象分配內存并調用構造函數完成初始化。

    Person *?person =?new?Person;

    相當于:

    Person *person = (Person *)malloc(sizeof(Person)); if( person == NULL ) {return 0; } person->Init(); // 構造函數

    ?

    new?運算符和?delete?運算符:

  • 所有new出來的對象?都會返回該類型的指針
  • malloc?返回?void *?還要強轉
  • malloc會調用構造嗎?不會!?new會調用構造
  • new是運算符,malloc是函數
  • delete也是運算符,配合new用
  • new?出來的對象用void *?接收,會釋放不了
  • new?出來的數組,如何釋放?delete [] ...
  • new?出來的數組,肯定會調用默認構造
  • 總結

    以上是生活随笔為你收集整理的C++基础学习笔记 day03的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。