生活随笔
收集整理的這篇文章主要介紹了
C++ 不懂的地方 记录01
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C++ 中初始化列表, 的詳細(xì)使用?沒有默認(rèn)構(gòu)造函數(shù)的類類型,因為使用初始化列表可以不必調(diào)用默認(rèn)構(gòu)造函數(shù)來初始化,而是直接調(diào)用拷貝構(gòu)造函數(shù)初始化 這句話不是很理解
//手機(jī)類
class Phone
{
public:Phone(string pName){cout << "Phone的構(gòu)造函數(shù)調(diào)用" << endl;m_PhoneName = pName;}Phone(const Phone &p) { //拷貝構(gòu)造函數(shù) m_PhoneName = p.m_PhoneName;}~Phone(){cout << "Phone的析構(gòu)函數(shù)調(diào)用" << endl;}string m_PhoneName; //手機(jī)名稱
};void test02() {Phone *p1 = new Phone("vivo"); // 這里的內(nèi)存分配情況??????????
}
以上疑惑在(C++ 有參構(gòu)造 無參構(gòu)造 拷貝構(gòu)造 以及參數(shù)化列表 成員對象之間的執(zhí)行關(guān)系)進(jìn)行了解答。
C++ 靜態(tài)成員對象與非靜態(tài)成員對象 內(nèi)存分配 以及 聲明定義的區(qū)別?
靜態(tài)成員對象是存儲在內(nèi)存中的全局?jǐn)?shù)據(jù)區(qū)嗎?
靜態(tài)成員變量在類中聲明 類外初始化,
那么而 非靜態(tài)成員變量如果創(chuàng)建對象的話,在類內(nèi)是不是僅僅只是聲明.?
class Printer {
private:static int count = 0; // 為什么這樣不可以?
};class Printer {
private:int count = 0; //這樣就可以?
};
教程說:
子類不會繼承 父類中的構(gòu)造和析構(gòu)函數(shù),只有父類自己才知道如果構(gòu)造和析構(gòu)自己的屬性
那么疑問:子類會繼承 賦值函數(shù)嗎?
#include <string>
#include <iostream>
using namespace std;
class Base {
public:char* m_name;int m_age;Base() {cout << "Base no pattern create" << endl;const char* nametemp = "def";this->m_name = new char[strlen(nametemp) + 1];strcpy(this->m_name, nametemp);this->m_age = 18;}Base(const char *name, int age) {cout << "Base use pattern create" << endl;this->m_name = new char[strlen(name) + 1];strcpy(this->m_name, name);this->m_age = age;}Base(const Base & b) {cout << "Base copy create" << endl;this->m_name = new char[strlen(b.m_name) + 1];strcpy(this->m_name, b.m_name);this->m_age = b.m_age;}Base& operator=(const Base & b) {cout << "Base = fun" << endl;this->m_name = new char[strlen(b.m_name) + 1];strcpy(this->m_name, b.m_name);this->m_age = b.m_age;return *this;}~Base() {cout << "Base delete" << endl;if (this->m_name != NULL) {delete[] this->m_name;this->m_name = NULL;}}
};class Son : public Base {
public:int m_id;};
void test1() {/*Son s;cout << s.m_age << endl;*/Son s; // 這樣會調(diào)用父類的無參構(gòu)造Son s1(s); // 這樣會調(diào)用父類的拷貝構(gòu)造//Son s("Tom", 2); // 這樣報錯, 因為子類根本不會繼承父類的構(gòu)造函數(shù)
}
void test2() {}
int main()
{//test1();return 0;
}
Son s; // 這樣會調(diào)用父類的無參構(gòu)造
Son s1(s); // 這樣會調(diào)用父類的拷貝構(gòu)造
雖然說沒有繼承,但是還是調(diào)用了 父類的方法
在C++中,構(gòu)造函數(shù)不會自動繼承,只是如果子類沒有寫構(gòu)造函數(shù),那么系統(tǒng)會這個類自動添加一個默認(rèn)構(gòu)造函數(shù),是一個空函數(shù)體,所以什么也沒有做,接著就會調(diào)用父類的構(gòu)造函數(shù),所以你覺得是繼承了父類的構(gòu)造函數(shù)。 子類和父類的構(gòu)造函數(shù)的調(diào)用順序:
class B:public A
B b1;
那么構(gòu)造函數(shù)的調(diào)用順序是:A(),B()
如果不想調(diào)用基類的構(gòu)造函數(shù),那么就應(yīng)該在子類中寫一個構(gòu)造函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的C++ 不懂的地方 记录01的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。