C++类的组合

 以另一个类的对象为数据成员

构造函数的写法,必须采用初始化参数列表的写法

类的组合构造顺序问题:

类的组合析构问题:

#include<iostream>
#include<string>
using namespace std;
class Girl {
public:
	Girl(string name,int age):name(name),age(age){}
	void print() {
		cout << name << "\t" << age << endl;
	}
protected:
	void printData() {
		cout << name << "\t" << age << endl;
	}
	string name;
	int age;
};
class Boy {
public:
	//不仅要对自己的数据成员初始化,还要对组合类的数据成员初始化,且必须采用初始化参数列表
	//对于自己的属性想用什么方式就用什么方式初始化
	Boy(string mmname, int mmage, string bbname) :girl(mmname, mmage) /*调用Girl类构造函数所以必须一致*/ {
		this->bbname = bbname;//优先构造组合类对象顺序0
	}
	Boy(string bbname):bbname(bbname),girl("默认",18) {}
	void print() {
		girl.print();
		//girl.printData();不可访问,boy对于Boy是类外
		cout << bbname << endl;
	}
protected:
	string bbname;
	Girl girl;//没有这种写法Girl girl("男孩",18)
};
class A {
public:
	A(string str) :str(str) {
		cout << str;
	}
	string str;
};
class B {
public:
	B(string str) :str(str) {
		cout << str;
	}
	string str;
};
class C {
public:
	C(string str) :str(str) {
		cout << str;
	}
	string str;
};
class D {
public://构造顺序和析构顺序问题,构造顺序和初始化参数列表无关,只和定义顺序有关
	D(string stra, string strb, string strc) :a(stra), b(strb), c(strc) {
		cout << "D" << endl;
	}
	A a;
	B b;
	C c;
};

int main() {
	Girl mm("美女", 18);
	Boy gg("帅哥");
	gg.print();
	Boy gg1("美女", 20, "帅哥1");
	gg1.print();

	D d("a", "b", "c");

	return 0;
}

类中类

依旧受权限限定,访问方式需要类名限定

#include<iostream>
using namespace std;

struct Node
{
	int data;
	Node* pNext;
	Node() {
		this->pNext = nullptr;
	}
	Node(int data) {
		this->data = data;
		this->pNext = nullptr;
	}
};
class List {
public:
	List() {
		headNode = new Node;
	}
	void insert_front(int data) {
		Node* newNode = new Node(data);
		newNode->pNext = headNode->pNext;
		headNode->pNext = newNode;

	}
protected:
	Node* headNode;
private:
public:
	
	//迭代器,类中类->类模范指针行为
	class iterator {
	public:
		iterator(Node* pMove=nullptr):pMove(pMove){}
		void operator=(iterator object) {
			this->pMove = object.pMove;
		}
		bool operator!=(iterator object) {
			return this->pMove != object.pMove;
		}
		iterator operator++(int) {
			pMove = pMove->pNext;
			return iterator(pMove);
		}
		Node* operator*() {
			return pMove;
		}

	protected:
		struct Node* pMove;//c++struct可以省略
		
	};
	iterator begin() {
		return iterator(headNode->pNext);//匿名对象
	}
	iterator end() {
		return iterator(nullptr);
	}
};
//类中的枚举类型
class A {
public:
	enum time{four,five,six};
protected:
	enum data{one,two,three};
	//类中的枚举类型也受权限限定
};

int main() {
	List list;
	for (int i = 0; i < 3; i++) {
		list.insert_front(i);
	}
	List::iterator iter;
	for (iter = list.begin(); iter != list.end(); iter++) {
		cout << (*iter)->data;
	}
	//cout<<A::data::mon<<endl;
	cout << A::time::five<< endl;
	return 0;
}

C++中默认的函数

默认构造函数

默认拷贝函数

默认析构函数

默认的复制运算符

#include<iostream>
using namespace std;

class A {
public:
	A() = default;
	A(A& object) = default;
	~A() = default;
	A& operator=(A& object) = default;
protected:
};
int main() {
	A a;
	A b = a;


	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值