标签:成员 编译 using name span 类型比较 length 程序 nbsp
在此之前我们创建一个对象的语法是:
Class object(arguments); //Class是类名 //object是对象 //(arguments)是传入的参数,这一部分可以没有
现在我们想要动态的创建对象,还是要使用到关键字new。语法如下:
//无参构造函数 ClassName* pObject = new ClassName;
//无参构造函数也可以写为:
//ClassName* pObject = new ClassName();
//有参构造函数 ClassName* pObject = new ClassName(arguments);
与之前的方式还有一个区别在于,之前的方法返回的是一个对象,而现在返回的是Class类型的指针,这个指针指向所创建对象的位置。因此,如果我们想要使用这个对象,就先要使用解引用运算符(*)先获取到对象,再使用点操作符(.)来操作对象的属性和方法。
//string相比其他的基本数据类型比较特殊,C++中的string本身就是一个类 //为了方便,我们直接使用string类 #include <iostream> using namespace std; int main() { //有参构造函数 string* pString = new string("abcdef"); cout << "字符串为:" << *pString << endl; cout << "字符串的长度为:" << (*pString).length() << endl; return 0; }
运行结果:
但是这样一来,似乎显得有些麻烦,必须要先解引用得到对象本身才可以操作。因此,C++提供了一个成员选择操作符("->",一个短划线"-"后面跟一个大于号">"),它的作用就在于简化指针访问对象成员。如上面的例子中的:
cout << "字符串的长度为:" << (*pString).length() << endl;
可以写为:
cout << "字符串的长度为:" << pString->length() << endl;
说到这里,还没有说为什么要动态创建对象。你可能会说,这样创建不就是使用了new吗?和原来没什么区别啊?
其中的奥妙就在于new这个关键字上。我们知道new这个关键字会动态的分配一段内存空间,而这是之前静态创建对象无法做到的。也就是说,静态创建对象的内存不是由程序员来管理的,而是在编译的过程中完成的。但是动态的不一样了,它是在运行时完成的,我们可以动态的管理它的内存空间。
如果一个程序静态创建了10000个对象,那么可能内存就不够用了,因为没有办法去销毁他们。但是使用动态的方式,我们就可以即时delete掉,减少内存的负担。
还有一点是,如果用户想要在运行时创建对象,那么就只能使用动态创建对象的方式。这和之前我们动态创建一个数组的内存空间类似。
标签:成员 编译 using name span 类型比较 length 程序 nbsp
原文地址:https://www.cnblogs.com/bwjblogs/p/12725378.html