第五部分:高级主题
第十七章:用于大型程序的工具:异常处理、命名空间、多重继承
1.独立开发的库,最好定义在自己的namespace空间里面。以防止重名。
2.抛出异常时,栈展开:(过程如下)
暂停当前函数的执行,开始查找匹配的catch子句,匹配相应的异常类,如果找不到匹配的cache程序就调用库函数terminate.
3.栈展开期间,会调用局部对象的西沟函数的。(西沟函数不应该抛出异常)
4.cache子句通常次序必须反应类型层次
5.重新抛出
6.异常类:exception
7.名字空间:命名空间可放在头文件中,
全局命名空间:用 :: 来引用
8.没有名字的名字空间: namespace { int a ; .......}
9.名字空间成员使用: std::cout
1.using声明
第十八章:特殊工具与技术
1.new表达式能够自动运行合适的构造函数来初始化每个动态分配的类类型对象。delete则能够调用合适的西沟函数来释放对象。这是与malloc free的不同之处。
2.new的预分配内存,并不会去创建对象;只有当用到时候才会去创建对象,这是为了防止,对象构造了没人用,不久浪费了构造时所占的资源导致浪费。
3.allocator类:分配内存类
operator new ; operator delete;这两个操作符 与 内置类型的 new delete不是同一个意思,不要搞混了。 我们可以在operator new()中调用 new来达到自己类new delete的方法。
4.void* operator new(size_t);
void* operator new[](size_t);
一般来说allocator比operator new delte更安全。
5.如果类重定义了operator new、 operator new[] 那么就使用这个,否则使用标准库版本
6. 用户可以通过全局作用域确定操作符,可以使用标准库函数的new delete的表达式:
A a = new a();//使用自己的new
A a = ::new a();//使用全局定义域的new:即 标准库new
7.一个内存分配器基础类:CachedObj类:慢慢研究吧先。
运行时类型识别:RTTI(仅仅指针、引用有效):typeid , dynamic_cast #include <typeinfo>
1.typeid:返回指针或引用所指对象的实际类型
例子:
if(typeid(ptr) == typeid(AbcClass) ) ||| if(typeif(ptr1) == typeid(ptr2))
----
bool operator==(&v1,&v2) :类型的对比
{
return typeid(v1) == typeid(v2) && v1.equal(v2);
}
2.dynamic_cast:将基类型的指针或引用安全的转换为派生类行的指针或引用。
例子:
if( Des *desP = dynamic_cast<Des*>(basePtr) ) 转换指针
{} else {}
----
Des &d = dynamic_cast<Des&>(b); 转换引用
3.嵌套类
4.volatile 不执行优化
5.链接指示:extern "C"
第十七章:用于大型程序的工具:异常处理、命名空间、多重继承
1.独立开发的库,最好定义在自己的namespace空间里面。以防止重名。
2.抛出异常时,栈展开:(过程如下)
暂停当前函数的执行,开始查找匹配的catch子句,匹配相应的异常类,如果找不到匹配的cache程序就调用库函数terminate.
3.栈展开期间,会调用局部对象的西沟函数的。(西沟函数不应该抛出异常)
4.cache子句通常次序必须反应类型层次
5.重新抛出
6.异常类:exception
7.名字空间:命名空间可放在头文件中,
全局命名空间:用 :: 来引用
8.没有名字的名字空间: namespace { int a ; .......}
9.名字空间成员使用: std::cout
1.using声明
第十八章:特殊工具与技术
1.new表达式能够自动运行合适的构造函数来初始化每个动态分配的类类型对象。delete则能够调用合适的西沟函数来释放对象。这是与malloc free的不同之处。
2.new的预分配内存,并不会去创建对象;只有当用到时候才会去创建对象,这是为了防止,对象构造了没人用,不久浪费了构造时所占的资源导致浪费。
3.allocator类:分配内存类
operator new ; operator delete;这两个操作符 与 内置类型的 new delete不是同一个意思,不要搞混了。 我们可以在operator new()中调用 new来达到自己类new delete的方法。
4.void* operator new(size_t);
void* operator new[](size_t);
一般来说allocator比operator new delte更安全。
5.如果类重定义了operator new、 operator new[] 那么就使用这个,否则使用标准库版本
6. 用户可以通过全局作用域确定操作符,可以使用标准库函数的new delete的表达式:
A a = new a();//使用自己的new
A a = ::new a();//使用全局定义域的new:即 标准库new
7.一个内存分配器基础类:CachedObj类:慢慢研究吧先。
运行时类型识别:RTTI(仅仅指针、引用有效):typeid , dynamic_cast #include <typeinfo>
1.typeid:返回指针或引用所指对象的实际类型
例子:
if(typeid(ptr) == typeid(AbcClass) ) ||| if(typeif(ptr1) == typeid(ptr2))
----
bool operator==(&v1,&v2) :类型的对比
{
return typeid(v1) == typeid(v2) && v1.equal(v2);
}
2.dynamic_cast:将基类型的指针或引用安全的转换为派生类行的指针或引用。
例子:
if( Des *desP = dynamic_cast<Des*>(basePtr) ) 转换指针
{} else {}
----
Des &d = dynamic_cast<Des&>(b); 转换引用
3.嵌套类
4.volatile 不执行优化
5.链接指示:extern "C"