构造函数使用new注意事项:
- 如果在构造函数使用new来初始化指针,则在析构函数使用delete
- new和delete要对应。new对应delete,new [] 对应delete []
- 如果有多个构造函数,必须以相同的方式使用new,因为只有一个析构函数。默认构造函数将它设置为nullptr或0
有关返回对象的说明
返回指向const对象的引用
使用const引用旨在提高效率
返回引用不会调用复制函数
引用指向对象应该在调用函数执行时存在,执行完毕后引用的对象也应该存在
一般返回的是参数,参数有const,返回对象引用也是const类型返回非const对象的引用
重载赋值运算符、以及重载运算符<<与cout一起使用返回的ostream引用都不用const返回对象
如果被返回的对象是被调用函数中的局部变量,则不应该按引用方式返回它
比如operator+返回的是局部变量对象,返回对象,则程序将创建一个新对象副本,调用复制构造函数复制到新对象副本上供程序访问。然后析构函数将局部对象delete。返回const对象
f1 + f2 = f3(假如f都是类对象),这样的语句如果是一个返回对象的operator+重载运算符是可行的。他将使用+将f1和f2相加,然后赋值运算符将f1+f2用f3覆盖。
将返回类型设置为const对象,则可避免发生错误
总结:
- 如果方法或函数要返回局部变量,则返回类型为对象而不是引用。这种情况下将调用复制构造函数来生成返回的对象。
- 如果方法要返回一个没有公有复制构造函数的类,如ostream、istream,则返回对象一定是对象的引用。
- 如果方法或函数两个都行,返回引用。
指向类的指针
- 使用new初始化一个指向类对象的指针
class_name* ptr = new class_name(value)
原理:new class_name(value)
将调用如下构造函数:
class_name(type_name)
或者class_name(const type_name)
这是为对象分配内存,用一块新内存块创造一个对象然后指针指向它。动态分配的内存需要手动用delete删除- 下面这个将调用默认构造函数
class_name* pte = new class_name;
指针和对象小结
String* ptr
声明为指向类的对象String* ptr = &str
将指针初始化为已有对象String* ptr = new String
使用默认构造函数创建对象对指针initializeString* ptr = new String("Hi")
使用new和String(const char*)类构造函数初始化指针String* ptr = new String(String_object)
使用new和String(const String& ) 类构造函数初始化指针if(saying[i].length < shortest->length)
使用->操作符通过指针访问类方法if(sayings<*first)
使用*解引用操作符从指针获得对象
使用new创建对象原理:比如
String* ptr= new String("hi")
- 为对象分配一块内存(比如x2400)
- 调用类构造函数,为''hi''分配内存(x2000),然后将x2000赋值给str,将长度2赋值给len,更新num_str值。
- 创建ptr变量
- 将新对象地址(x2400)给ptr变量
定位new运算符
char * buffer = new char [100];
String* ptr1 = new (buffer) String("hello");
String* ptr2 = new (buffer+10) String("Hi");
String* ptr3 = new String;
String* ptr4 = new String("Hello")
delete ptr3;
delete ptr4;
delete [] buffer;
- 注意使用定位new时,要注意分配的内存是否已经被占用,否则将覆盖原始数据(因为不是automatic的)
- 存放在heap中的,要使用delete删除
- 存放在数组内存里的,只要delete掉这一块数组内存就好.