- C++ 中初始化列表, 的詳細使用?
- 沒有默認構造函數的類類型,因為使用初始化列表可以不必調用默認構造函數來初始化,而是直接調用拷貝構造函數初始化 這句話不是很理解
//手機類
class Phone
{
public:Phone(string pName){cout << "Phone的構造函數調用" << endl;m_PhoneName = pName;}Phone(const Phone &p) { //拷貝構造函數 m_PhoneName = p.m_PhoneName;}~Phone(){cout << "Phone的析構函數調用" << endl;}string m_PhoneName; //手機名稱
};void test02() {Phone *p1 = new Phone("vivo"); // 這里的內存分配情況??????????
}
以上疑惑在(C++ 有參構造 無參構造 拷貝構造 以及參數化列表 成員對象之間的執行關系)進行了解答。
- C++ 靜態成員對象與非靜態成員對象 內存分配 以及 聲明定義的區別?
靜態成員對象是存儲在內存中的全局數據區嗎?
靜態成員變量在類中聲明 類外初始化,
那么而 非靜態成員變量如果創建對象的話,在類內是不是僅僅只是聲明.?
class Printer {
private:static int count = 0; // 為什么這樣不可以?
};class Printer {
private:int count = 0; //這樣就可以?
};
- 教程說:
子類不會繼承 父類中的構造和析構函數,只有父類自己才知道如果構造和析構自己的屬性
那么疑問:子類會繼承 賦值函數嗎?
#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; // 這樣會調用父類的無參構造Son s1(s); // 這樣會調用父類的拷貝構造//Son s("Tom", 2); // 這樣報錯, 因為子類根本不會繼承父類的構造函數
}
void test2() {}
int main()
{//test1();return 0;
}
Son s; // 這樣會調用父類的無參構造
Son s1(s); // 這樣會調用父類的拷貝構造
雖然說沒有繼承,但是還是調用了 父類的方法
在C++中,構造函數不會自動繼承,只是如果子類沒有寫構造函數,那么系統會這個類自動添加一個默認構造函數,是一個空函數體,所以什么也沒有做,接著就會調用父類的構造函數,所以你覺得是繼承了父類的構造函數。 子類和父類的構造函數的調用順序:
class B:public A
B b1;
那么構造函數的調用順序是:A(),B()
如果不想調用基類的構造函數,那么就應該在子類中寫一個構造函數。