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

C++-面向对象(一)

作者头像
cwl_java
发布2019-10-28 10:41:47
2890
发布2019-10-28 10:41:47
举报
文章被收录于专栏:cwl_Javacwl_Java

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

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

面向对象
  • 对象
  • 成员变量、成员函数
  • 封装、继承、多态
  • C++中可以使用struct、class来定义一个类
  • struct和class的区别
    • struct的默认成员权限是public
    • class的默认成员权限是private
代码语言:javascript
复制
#include <iostream>
using namespace std;

struct Person {
	int m_id;
	int m_age;
	int m_height;

	void display() {
		cout << "m_id = " << this->m_id << endl;
		cout << "m_age = " << this->m_age << endl;
		cout << "m_height = " << this->m_height << endl;
	}
};

int main() {
	Person person;
	person.m_id = 10;
	person.m_age = 20;
	person.m_height = 30;

	Person *pPerson = (Person *)&person.m_age;
	pPerson->m_id = 40;
	pPerson->m_age = 50;

	person.display();

	getchar();
	return 0;
}

//struct Person {
//	int m_id;
//	int m_age;
//	int m_height;
//
//	void display() {
//		// this指向Person对象的指针
//		// this里面存储的就是Person对象的地址值
//		this->m_id = 5;
//		this->m_age = 6;
//		this->m_height = 7;
//
//		/*cout << "m_id = " << this->m_id << endl;
//		cout << "m_age = " << this->m_age << endl;
//		cout << "m_height = " << this->m_height << endl;*/
//	}
//};
//
//int main() {
//	Person person;
//	person.m_id = 1;
//	person.m_age = 2;
//	person.m_height = 3;
//	person.display();
//
//	Person person2;
//	person2.m_id = 4;
//	person2.m_age = 5;
//	person2.m_height = 6;
//	person2.display();
//
//	/*Person *pPerson = &person;
//	pPerson->m_id = 4;
//	pPerson->m_age = 5;
//	pPerson->m_height = 6;*/
//
//	/*
//	ebp-14h == &person
//
//	 mov         dword ptr [ebp-14h],1  
//	 mov         dword ptr [ebp-10h],2  
//	 mov         dword ptr [ebp-0Ch],3 
//
//	 ebp-20h == &pPerson
//
//	 lea         eax,[ebp-14h]  
//	 mov         dword ptr [ebp-20h],eax  
//
//	 取出person对象的地址值,赋值给了eax
//	 mov         eax,dword ptr [ebp-20h] 
//	 mov         dword ptr [eax],4  
//
//	 取出person对象的地址值,赋值给了eax
//	 mov         eax,dword ptr [ebp-20h]  
//	 mov         dword ptr [eax+4],5  
//
//	 取出person对象的地址值,赋值给了eax
//	 mov         eax,dword ptr [ebp-20h]  
//	 mov         dword ptr [eax+8],6 
//	*/
//
//	/*cout << "&person = " << &person << endl;
//	cout << "&person.m_id = " << &person.m_id << endl;
//	cout << "&person.m_age = " << &person.m_age << endl;
//	cout << "&person.m_height = " << &person.m_height << endl;
//
//	cout << sizeof(person) << endl;*/
//
//	getchar();
//	return 0;
//}

//struct Person {
//	int m_age;
//
//	void run() {
//		cout << "run() - age is " << m_age << endl;
//	}
//};
//
//int main() {
//	Person person;
//	person.m_age = 20;
//	person.run();
//
//	Person *pPerson = &person;
//	pPerson->m_age = 30;
//	pPerson->run();
//
//	// cout << sizeof(person) << endl;
//
//	getchar();
//	return 0;
//}

//struct Person {
////private:
//	// 成员变量
//	int age;
//
//	// 成员函数
//	void run() {
//		cout << "run() - age is " << age << endl;
//	}
//
////public:
////	void test() {
////		run();
////	}
//};
//
//class Student {
//public:
//	int no;
//
//	void study() {
//		cout << "study() - no is " << no << endl;
//	}
//};
//
//int main() {
//	// 在栈空间分配了内存给person对象
//	// 这个person对象的内存会自动回收,不用开发人员去管理
//	Person person;
//	person.age = 20;
//	person.run();
//
//	Person person2;
//	person2.age = 30;
//	person2.run();
//
//	Student student;
//	student.no = 100;
//	student.study();
//
//	getchar();
//	return 0;
//}
编码规范
  • 变量名规范参考
    • 全局变量:g_
    • 成员变量:m_
    • 静态变量:s_
    • 常量:c_
    • 使用驼峰标识
this

this是指向当前对象的指针

封装
代码语言:javascript
复制
#include <iostream>
using namespace std;

//class Person {
//public:
//	int m_age;
//	void run() {
//		cout << "run()" << endl;
//	}
//};
//
//int main() {
//	Person person;
//	person.m_age = 10;
//	person.run();
//
//	return 0;
//}

struct Person {
private:
	int m_age;

public:
	void setAge(int age) {
		// 过滤
		if (age < 0) return;

		this->m_age = age;
	}

	int getAge() {
		return this->m_age;
	}
};


// 在C\C++中,定义在函数外面的就是全局变量
// 全局变量的特点:整个程序运行过程中都存在
int age;
Person p;

int main() {
	Person person;
	person.setAge(-20);

	cout << person.getAge() << endl;

	getchar();
	return 0;
}
内存布局
  • 每个应用都有自己独立的内存空间,其内存空间一般都有以下几大区域
    • 代码段(代码区):用于存放代码
    • 数据段(全局区):用于存放全局变量等
    • 栈空间
      • 每调用一个函数就会给它分配一段连续的栈空间,等函数调用完毕后会自动回收这段栈空间
      • 自动分配和回收
    • 堆空间:需要主动去申请和释放
    在这里插入图片描述
    在这里插入图片描述
堆空间
  • 在程序运行过程,为了能够自由控制内存的生命周期、大小,会经常使用堆空间的内存
  • 堆空间的申请\释放
    • malloc \ free
    • new \ delete
    • new [] \ delete []
  • 注意
    • 申请堆空间成功后,会返回那一段内存空间的地址
    • 申请和释放必须是1对1的关系,不然可能会存在内存泄露
  • 现在的很多高级编程语言不需要开发人员去管理内存(比如Java),屏蔽了很多内存细节,利弊同时存在
    • 利:提高开发效率,避免内存使用不当或泄露
    • 弊:不利于开发人员了解本质,永远停留在API调用和表层语法糖,对性能优化无从下手
代码语言:javascript
复制
#include <iostream>
using namespace std;

void test() {
	// 申请4个字节的堆空间内存
	int *p = (int*)malloc(4);

	/*char *p = (char *)malloc(4);
	*p = 1;
	*(p + 1) = 2;

	p[0] = 1;
	p[1] = 2;*/
}

void test2() {
	int *p = new int;
	int *p2 = new int;

	delete p;
	delete p2;
}

void test3() {
	/*int *p = (int *)malloc(sizeof(int) * 10);
	p[0] = 10;
	p[1] = 10;
	p[2] = 10;
	p[3] = 10;

	free(p);*/

	int *p = new int[10];

	// delete [] p;
}

void test4() {
	int *p = new int; // 内存泄露 
	p = new int;

	delete p;
}

void test5() {
	int size = sizeof(int);
	int *p = (int *)malloc(size);
	// memory set
	// 从p开始的4个字节, 每个字节都存放0
	memset(p, 0, size);

	cout << *p << endl;

	free(p);
}

void test6() {
	// 没有初始化
	int *p1 = new int;
	// 初始化为0
	int *p2 = new int();
	// 初始化为5
	int *p3 = new int(5);
	// 没有初始化
	int *p4 = new int[3];
	// 全部元素初始化为0
	int *p5 = new int[3]();
	// 全部元素初始化为0
	int *p6 = new int[3]{};
	// 首元素初始化为5,其他元素初始化为0
	int *p7 = new int[3]{ 5 };

	cout << p7[0] << endl;
	cout << p7[1] << endl;
	cout << p7[2] << endl;
}

struct Person {
	int m_age;
};

// 全局区
Person g_person;

int main() {
	// 栈空间
	Person person;

	// 堆空间
	Person *p = new Person();
	p->m_age = 20;

	delete p;

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

	free(p2);*/

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 面向对象
  • 编码规范
  • this
  • 封装
  • 内存布局
  • 堆空间
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档