C++ 不懂的地方 记录01

  1. C++ 中初始化列表, 的详细使用?
  2. 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化 这句话不是很理解
//手机类
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++ 有参构造 无参构造 拷贝构造 以及参数化列表 成员对象之间的执行关系)进行了解答。

  1. C++ 静态成员对象与非静态成员对象 内存分配 以及 声明定义的区别?
    静态成员对象是存储在内存中的全局数据区吗?
    静态成员变量在类中声明 类外初始化,
    那么而 非静态成员变量如果创建对象的话,在类内是不是仅仅只是声明.?
class Printer {
private:
	static int count = 0;    // 为什么这样不可以?
};

class Printer {
private:
	int count = 0; //这样就可以?
};
  1. 教程说:
    子类不会继承 父类中的构造和析构函数,只有父类自己才知道如果构造和析构自己的属性
    那么疑问:子类会继承 赋值函数吗?
#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()

如果不想调用基类的构造函数,那么就应该在子类中写一个构造函数。

发布了100 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43903378/article/details/103816625