前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++-面向对象(二)

C++-面向对象(二)

作者头像
cwl_java
发布2019-10-28 10:41:14
3590
发布2019-10-28 10:41:14
举报
文章被收录于专栏:cwl_Java

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_42528266/article/details/102750979

memset

memset函数是将较大的数据结构(比如对象、数组等)内存清零的比较快的方法

对象的内存
  • 对象的内存可以存在于3种地方
    • 全局区(数据段):全局变量
    • 栈空间:函数里面的局部变量
    • 堆空间:动态申请内存(malloc、new等)
构造函数(Constructor)
  • 构造函数(也叫构造器),在对象创建的时候自动调用,一般用于完成对象的初始化工作
  • 特点
    • 函数名与类同名,无返回值(void都不能写),可以有参数,可以重载,可以有多个构造函数
    • 一旦自定义了构造函数,必须用其中一个自定义的构造函数来初始化对象
  • 注意
    • 通过malloc分配的对象不会调用构造函数
  • 一个广为流传的、很多教程\书籍都推崇的错误结论:
    • 默认情况下,编译器会为每一个类生成空的无参的构造函数 正确理解:在某些特定的情况下,编译器才会为类生成空的无参的构造函数
代码语言:javascript
复制
#include <iostream>
using namespace std;

struct Person {
	int m_age;

	Person() {
		cout << "Person()" << endl;
		// this->m_age = 0;
		memset(this, 0, sizeof(Person));
	}

	Person(int age) {
		cout << "Person(int age)" << endl;
		this->m_age = age;
	}
};

// 全局区
Person g_person1; // Person()
Person g_person2(); // 这是一个函数声明,函数名叫g_person2,无参,返回值类型是Person
Person g_person3(10); // Person(int age)

int main() {
	// 栈空间
	Person person1; // Person()
	Person person2(); // 函数声明,函数名叫person2,无参,返回值类型是Person
	Person person3(20);  // Person(int age)

	// 堆空间
	Person *p1 = new Person; // Person()
	Person *p2 = new Person(); // Person()
	Person *p3 = new Person(30);  // Person(int age)

	// 4次无参构造函数
	// 3次有参构造函数

	getchar();
	return 0;
}
  • 如果自定义了构造函数,除了全局区,其他内存空间的成员变量默认都不会被初始化,需要开发人员手动初始化
成员变量的初始化
代码语言:javascript
复制
#include <iostream>
using namespace std;

struct Person {
	int m_age;

	/*Person() {
		cout << "Person()" << endl;
		this->m_age = 0;
	}*/
};

void test() {
	//int *p = new int();
	//memset(p, 1, 4);
	//// 0000 0001 0000 0001 0000 0001 0000 0001 
	//cout << *p << endl;

	//int *p = (int *) malloc(8);
	//free(p);

	/*int *p = (int *) malloc(2); 
	*p = 5;*/

	// 0000 0000 0000 0000 0000 0000 0000 0101
}

// 全局区(成员变量初始化为0)
Person g_person;

int main() {
	// 栈空间(成员变量没有初始化)
	Person person;

	// 堆空间
	Person *p1 = new Person; // 成员变量没有初始化
	Person *p2 = new Person(); // 成员变量有初始化

	cout << "g_person " << g_person.m_age << endl;
	cout << "p1 " << p1->m_age << endl;
	cout << "p2 " << p2->m_age << endl;

	getchar();
	return 0;
}
析构函数(Destructor)
  • 析构函数(也叫析构器),在对象销毁的时候自动调用,一般用于完成对象的清理工作
  • 特点:函数名以~开头,与类同名,无返回值(void都不能写),无参,不可以重载,有且只有一个析构函数
  • 注意:通过malloc分配的对象free的时候不会调用构造函数
  • 构造函数、析构函数要声明为public,才能被外界正常使用
代码语言:javascript
复制
#include <iostream>
using namespace std;

class Person {
	int m_age;
public:
	// 对象创建完毕的时候调用
	Person() {
		cout << "Person()" << endl;
		this->m_age = 0;
	}

	Person(int age) {
		cout << "Person(int age)" << endl;
		this->m_age = age;
	}

	// 对象销毁(内存被回收)的时候调用
	~Person() {
		cout << "~Person()" << endl;
	}
};

//void test() {
//	Person person;
//}

int main() {
	Person person;

	/*{
		Person person;
	}*/

	/*Person *p = new Person();

	delete p;*/

	/*Person *p = (Person *) malloc(sizeof(Person));

	free(p);*/

	getchar();
	return 0;
}
对象的内存管理
  • 对象内部申请的堆空间,由对象内部回收
  • 多注意setter和析构的内存管理
代码语言:javascript
复制
#include <iostream>
using namespace std;

struct Car {
	int m_price;
	Car() {
		cout << "Car()" << endl;
	}

	~Car() {
		cout << "~Car()" << endl;
	}
};

struct Person {
	int m_age; // 4
	Car *m_car; // 4

	// 初始化工作
	Person() {
		cout << "Person()" << endl;

		 this->m_car = new Car();

		/*Car car;
		this->m_car = &car;*/
	}

	// 内存回收、清理工作(回收Person对象内部申请的堆空间)
	~Person() {
		cout << "~Person()" << endl;

		delete this->m_car;
	}
};

void test() {
	Person *p = new Person();

	delete p;
}

int main() {
	test();

	getchar();
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/10/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • memset
  • 对象的内存
  • 构造函数(Constructor)
  • 成员变量的初始化
  • 析构函数(Destructor)
  • 对象的内存管理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档