第十二章 类和动态内存分配
2017-03-26 17:17
267 查看
2017年3月26日 17:16:02
不能在类声明中初始化静态成员变量,因为声明只描述了如何分配内存,没有真的分配内存
静态成员可以在类外使用单独的语句来进行初始化,因为静态成员属于类,不属于对象
初始化语句指出了类型,并使用了作用域运算符,但没有使用关键字static
如果静态成员是const整数类型或者枚举型,则可以在类声明中初始化
在C++11中,类中声明成员变量的同时可以赋值
在构造函数中使用new来分配内存时,必须在相应的析构函数中使用delete来释放
12.1.2 特殊的成员函数
C++自动提供一下成员函数:
1.默认构造函数 2.默认析构函数 3.copy构造函数
4.赋值运算符 5.地址预算负
隐式地址运算符 返回 调用对象的地址
C++还提供了:移动构造函数和移动赋值运算符
1.默认构造函数
编译器提供一个不接收任何参数,也不执行任何操作的构造函数
创建对象时,总会调用构造函数
2.copy构造函数
用于将一个对象复制到新创建的对象中
常用原型:
class_name( const class_name& );
2.1何时使用copy构造函数
新建一个对象并将其初始化为同类现有对象时,copy构造函数都将调用
StringBad ditto(motto);
StringBad metto = motto;
StringBad also = StringBad(motto);
StringBad * pStringBad = new StringBad(motto);
中间两句可能使用copy构造函数直接创建,也可能使用copy构造函数生成临时对象,再赋值,取决于现实
每当程序生成了对象副本时,编译器都将使用copy构造函数
具体地说:当函数按值传递对象或函数返回对象时,都会调用
编译器生成临时对象,也调用
2.2 默认的copy构造函数的功能
默认的copy构造函数逐个复制非晶态成员(浅复制),复制的是成员的值。
如果成员本身是类对象,将使用这个类的copy构造函数来复制成员对象。
静态函数不受影响,因为它们属于整个类,不属于对象
如果类中的静态数据成员,其值将在新对象被创建时发生变化,则应提供一个显示copy构造函数来处理计数问题
当类成员存在指针时,应使用深拷贝:分配单独的空间
运算符必须深拷贝,但对于独一无二的对象,应将copy构造函数私有化,来禁止copy
3.赋值运算符
初始化: StringBad metoo = knot; //不一定使用赋值运算符,可能只是用copy构造函数
赋值: StringBad metoo;
metoo = knot; //使用重载的赋值运算符
初始化总会调用copy构造函数,而使用‘=’运算符也允许调用赋值运算符
赋值运算符的隐式实现也对成员进行逐个复制,但静态成员不受影响
12.3 在构造函数中使用new时,应注意的事项
1.如果构造函数中使用new来初始化指针成员,应在析构中使用delete
2.new和delete必须相互兼容
3.有多个构造函数时,应保证以相同的方式使用new,因为析构函数只有一个
C++提供关键字nullptr,来表示空
12.4 返回对象的说明
1.返回指向const对象的引用:提高效率,但不能返回局部变量的引用
2.返回指向非const对象的引用:
常用的情况:重载赋值运算符与'<<'运算符(前者提高效率,后者必须)
3.返回对象:
重载'+'运算符,存在调用copy构造函数来返回对象的开销,无法避免
4.返回const对象:
防止出现: 对象1 + 对象2 = 对象3 这种错误
总之:如果方法要返回局部对象,应返回对象;要返回一个没有公有copy构造函数的类对象,必须返回引用;
若两者都行,则返回引用优先
构造函数使用new的类:
1.析构函数中必须有相应的delete
2.每个构造函数应用new来初始化指针,或将指针置空
3.多个构造函数的new应同意,要么new,要么new[]
4.应定义一个分配内存的copy构造函数,实现深拷贝
5.应重载赋值运算符,实现深拷贝
不能在类声明中初始化静态成员变量,因为声明只描述了如何分配内存,没有真的分配内存
静态成员可以在类外使用单独的语句来进行初始化,因为静态成员属于类,不属于对象
初始化语句指出了类型,并使用了作用域运算符,但没有使用关键字static
如果静态成员是const整数类型或者枚举型,则可以在类声明中初始化
在C++11中,类中声明成员变量的同时可以赋值
在构造函数中使用new来分配内存时,必须在相应的析构函数中使用delete来释放
12.1.2 特殊的成员函数
C++自动提供一下成员函数:
1.默认构造函数 2.默认析构函数 3.copy构造函数
4.赋值运算符 5.地址预算负
隐式地址运算符 返回 调用对象的地址
C++还提供了:移动构造函数和移动赋值运算符
1.默认构造函数
编译器提供一个不接收任何参数,也不执行任何操作的构造函数
创建对象时,总会调用构造函数
2.copy构造函数
用于将一个对象复制到新创建的对象中
常用原型:
class_name( const class_name& );
2.1何时使用copy构造函数
新建一个对象并将其初始化为同类现有对象时,copy构造函数都将调用
StringBad ditto(motto);
StringBad metto = motto;
StringBad also = StringBad(motto);
StringBad * pStringBad = new StringBad(motto);
中间两句可能使用copy构造函数直接创建,也可能使用copy构造函数生成临时对象,再赋值,取决于现实
每当程序生成了对象副本时,编译器都将使用copy构造函数
具体地说:当函数按值传递对象或函数返回对象时,都会调用
编译器生成临时对象,也调用
2.2 默认的copy构造函数的功能
默认的copy构造函数逐个复制非晶态成员(浅复制),复制的是成员的值。
如果成员本身是类对象,将使用这个类的copy构造函数来复制成员对象。
静态函数不受影响,因为它们属于整个类,不属于对象
如果类中的静态数据成员,其值将在新对象被创建时发生变化,则应提供一个显示copy构造函数来处理计数问题
当类成员存在指针时,应使用深拷贝:分配单独的空间
运算符必须深拷贝,但对于独一无二的对象,应将copy构造函数私有化,来禁止copy
3.赋值运算符
初始化: StringBad metoo = knot; //不一定使用赋值运算符,可能只是用copy构造函数
赋值: StringBad metoo;
metoo = knot; //使用重载的赋值运算符
初始化总会调用copy构造函数,而使用‘=’运算符也允许调用赋值运算符
赋值运算符的隐式实现也对成员进行逐个复制,但静态成员不受影响
12.3 在构造函数中使用new时,应注意的事项
1.如果构造函数中使用new来初始化指针成员,应在析构中使用delete
2.new和delete必须相互兼容
3.有多个构造函数时,应保证以相同的方式使用new,因为析构函数只有一个
C++提供关键字nullptr,来表示空
12.4 返回对象的说明
1.返回指向const对象的引用:提高效率,但不能返回局部变量的引用
2.返回指向非const对象的引用:
常用的情况:重载赋值运算符与'<<'运算符(前者提高效率,后者必须)
3.返回对象:
重载'+'运算符,存在调用copy构造函数来返回对象的开销,无法避免
4.返回const对象:
防止出现: 对象1 + 对象2 = 对象3 这种错误
总之:如果方法要返回局部对象,应返回对象;要返回一个没有公有copy构造函数的类对象,必须返回引用;
若两者都行,则返回引用优先
构造函数使用new的类:
1.析构函数中必须有相应的delete
2.每个构造函数应用new来初始化指针,或将指针置空
3.多个构造函数的new应同意,要么new,要么new[]
4.应定义一个分配内存的copy构造函数,实现深拷贝
5.应重载赋值运算符,实现深拷贝
相关文章推荐
- 第十二章:类和动态内存分配
- 第十二章 类和动态内存分配
- 【c++ primer】第十二章 类和动态内存分配
- 第十二章-类和动态内存分配
- 第十二章 类和动态内存分配
- Java2实用教程(第二版)程序代码——第十二章 布局设计
- 追风筝的人 第十二章
- The Inventor Mentor-第十二章 传感器
- DELPHI基础教程 第十二章 异常处理与程序调试(三)
- [导入]【翻译】WF从入门到精通(第十二章):策略和规则
- 第十二章 满城搜索 [转载]
- 第二集 第一魂环 第十二章
- 算法导论学习笔记-第十二章-二叉查找树
- 疯狂的程序员-第十二章
- 算法导论 第十二章 二分检索树
- 王爽《汇编语言》(第二版) 学习笔记 (第十二章 内中断)
- WCF 4.0 进阶系列 – 第十二章 实现单向操作和异步操作(上)
- 第十二章 4 文件操作
- 第十二章 嵌入式系统的启动
- 12.8_第十二章小结