C++_课堂笔记_构造与析构

#include <iosteam>
#include <cstring>
using namespace std;

struct Date
{
	int y, m, d;
	void setDate(int, int, int);
	Date(int yy, int mm, int dd) {y = yy, m = mm, d = dd;}
};

class Student
{
private:
	char* name;
	Date birthday;
public:
	// 如果没写不带参数的构造函数,系统会提供一个不带参数的构造函数,称为缺省构造函数,或者是拷贝构造函数
	Student(const Student&); // 拷贝构造函数,当有new和delete的时候要写
	Student():birthday(2000, 3, 4) {} // 不带参数的构造函数
	Student(char*, int, int, int);
	~Student() {delete []name;} // 与构造函数成对出现
};

Student::Student & operator = (const Student &s1) // 运算符重载函数
{
	name = new char[strlen(s1.name) + 1];
	strnpy(name, s1.name, strlen(s1.name));
	birthday = s1.birthday;
	return *this;
}

Student::Student(const Student &s1) // 拷贝构造函数
	:birthday(s1.birthday) // 初始化
{
	// name = s1.name; // 错误 
	name = new char[strlen(s1.name) + 1];
	// name = s1.name; 错误,没用到新开辟的空间
	strncpy(name, s1.name, strlen(s1.name));
}

Student:: Student(char* p, int y, int m, int d)
	: birthday(y, m, d) // 初始化
{
	// name = p; 不好,指针会改变
	// name = new char[sizeof(p)]; // 指针的大小,一般为8个字节,但不是字符串的长度
	name = new char[strlen(p) + 1]; // 多一个位置存放'\0'
	strncpy(name, p, strlen(p));
};

void print(Student s)
{
	cout << s,name << endl; // error,私有的,不能访问
}

int main()
{
	const char *p = "zhangsan";
	Student s1((char*)p, 2000, 3, 4); // 强制类型转换
	// Student *s;
	// s = new Student[10000]; // 调用不带参数的构造函数10000次
	Student s2(s1); // 调用拷贝构造函数
	// print(s1); // 也会调用拷贝构造函数
	Student s3;
	s3 = s1; // 运算符重载

	return 0;
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
shared_ptr是C++中的智能指针,用于管理动态分配的内存。它可以自动地跟踪共享所有权并在不再需要时自动地释放内存。在构造shared_ptr时,我们可以使用weak_ptr或shared_ptr来初始化。其中,weak_ptr是一种弱引用,它不会增加引用计数,也不会阻止对象的析构。而shared_ptr是一种强引用,它会增加引用计数,并在引用计数为0时删除所管理的对象。 对于第一个引用中的代码,A类和B类之间的引用关系使用了weak_ptr来实现。这是因为如果使用shared_ptr,A和B互相持有shared_ptr的引用,会导致循环引用,无法正确地析构对象。 而第二个引用中的代码展示了一个错误的用法。在Demo类中,使用了shared_ptr来持有自身的引用。这样会导致对象无法正确地析构,因为对象的引用计数永远不会变为0。为了解决这个问题,我们应该使用weak_ptr来持有自身的引用。 最后一个引用中的代码展示了正常使用shared_ptr的情况。A类和B类之间的引用关系都使用了shared_ptr,这样可以正确地管理对象的生命周期,避免内存泄漏。 总之,当构造shared_ptr时,应该根据具体的需求选择使用weak_ptr还是shared_ptr来管理对象之间的引用关系。使用weak_ptr来避免循环引用,使用shared_ptr来建立强引用关系并正确管理对象的生命周期。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解](https://blog.csdn.net/chenlycly/article/details/130918547)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [C++ shared_ptr 、weak_ptr具体实现分析](https://blog.csdn.net/zzZhangYiLong/article/details/126696214)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值