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 = #
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关键字来创建的对象才是存储在内存堆中。
结尾
如果您觉得我还写的不错,请给我一点点的鼓励,您的鼓励就是我坚持的动力,当然啦,一切要量力而行,不要勉强哦!