C++随笔之对new关键字和类的理解

1. new关键字

        在像C#或Java的面向对象语言中,new关键字一般是和类的构造函数一起结合使用,其目的是创建类的对象,并将类对象的成员数据存储在内存堆中。

       代码示例如下:创建一个名为User的类并用new关键字创建对象

class User { //etc }
User user = new User();

         总结下像C#或Java的面向对象语言中new关键字的作用

                (1) new之后跟着的一般都是类的构造函数

                (2) new指令负责在内存堆中申请空间用来存储数据(一般是类成员数据)

        但是在C++语言中,new关键字的作用就和上述描述的作用不太一样了。在C++中,new关键字只是负责在内存堆中申请空间用来存储数据,它之后跟着的数据类型可以不是类,而堆中存储的数据来源也未必是类的成员!

        举例说明:     

#include<iostream>
using namespace std;
int main()
{
	/*
	* 声明几个基本数据类型的数据
	* 在其他面向对象语言中, 基本数据类型一般是存储在内存栈中的, C++默认也是如此
	*/
	int num = 100;
	double d_num = 10.23459;
	bool b = true;
	//显示以上数据在内存栈中存储的内存地址
	cout << "int数据的内存栈地址:\t" << &num << endl;
	cout << "double数据的内存栈地址:\t" << &d_num << endl;
	cout << "bool数据的内存栈地址:\t" << &b << endl;

	cout << "------------------------------------------------" << endl;

	/*
	* 用new关键字声明
	*/
	int* num_p = new int(100);
	double* d_num_p = new double(10.23459);
	bool* b_p = new bool(true);
	//显示以上数据在内存堆中存储的内存地址
	cout << "int数据的内存堆地址:\t" << num_p << endl;
	cout << "double数据的内存堆地址:\t" << d_num_p << endl;
	cout << "bool数据的内存堆地址:\t" << b_p << endl;

	return 0;
}

        运行 结果:

        可以看出,分割线上下的内存地址开头是不一样的,因此分割以下的数据都是存储在内存堆中,但是存储的数据都是用类声明的,它们的数据类型都是基本数据类型。

2.  class类

        在像C#或Java的面向对象语言中,用类声明的对象,其对象下的数据都是存储在内存堆中。但是C++中类声明出来的对象并一定是存储在内存堆中的。如果想将类对象存储在内存堆中,则使用new关键字。示例代码如下:   

#include<iostream>
#include<string>
using namespace std;

class User
{
private:
	string _name;
	int _age;
public:
	void setName(string name)
	{
		_name = name;
	}
	string getName()
	{
		return _name;
	}
	void setAge(int age)
	{
		_age = age;
	}
	int getAge()
	{
		return _age;
	}
	string toString()
	{
		return "Name: " + _name + ", Age: " + to_string(_age);
	}
};

int main()
{
	/*
	* 声明一个整型, 其目的是为了查看内存栈的开头地址
	*/
	int num = 10;
	int* num_p = &num;
	cout << "int型数据的内存栈地址:\t" << num_p << endl;

	/*
	* 声明一个类对象, 如果不用new关键字, 对象是存储在内存栈中的
	*/
	User u;
	u.setAge(20);
	u.setName("Sam");
	User* u_p = &u;
	cout << "User型数据的内存栈地址:\t" << u_p << endl;

	/*
	* 如果要把类对象存储到内存堆中, 则使用new关键字
	*/
	User* user_p = new User();
	user_p->setName("Daming");
	user_p->setAge(23);
	cout << "型数据的内存堆地址:\t" << user_p << endl;

	return 0;
}

         程序运行结果:

        根据内存地址开头部分的对比,我们可以看出,C++的类如果不通过new来创建对象的话,它的数据只能存储在内存栈中,只有用new关键字声明出来的类对象才会存储在内存堆中。

3. 总结

         ~  C++中的new关键字的作用只有一个,那就是在内存堆中声明一块空间,把new后面的数据存储在内存堆中。至于后面的数据类型是不是class对它而言是无所谓的,只要是数据就成!

         ~  C++中的class类如果不通过new关键字来创建类对象的话,那么类对象的数据是存储在内存栈中的,如果用new关键字来创建的对象才是存储在内存堆中。

结尾

        如果您觉得我还写的不错,请给我一点点的鼓励,您的鼓励就是我坚持的动力,当然啦,一切要量力而行,不要勉强哦!

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹏云友

您的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值