c++Primer5,高级主题

来源:互联网 发布:js 双引号字符转义 编辑:程序博客网 时间:2024/04/30 18:45

很快的过了前面的,这里也很快的过。

标准库特殊设施:
tuple类型
类似pair的模板,每个pair都有且有2个成员,而每个确定类型的tuple类型的成员数目是固定但数目可以任意个。
tuple<int, string, vector<double>> parr = {18, "hi", {2.0f, 3.0f}};
tuple<int, string, vector<double>> parr(18, "hi", {2.0f, 3.0f});
tuple<int, string, vector<double> > parr(18, "hi", vector<double>(2.0f, 3.0f));
auto i_v = get<0>(parr);
auto s_v = get<1>(parr);
auto v_v = get<2>(parr);
cout<<i_v<<" "<<s_v<<" "<<v_v[0];
需要编译器支持


bitset类型
更方便的使用标志位
bitset<13> bitvec1(0xbeef)//(1011111011101111)->1111011101111
bitset<20> bitvec2(0xbeef)//(1011111011101111)->00001111011101111
bitset<32> bitvec3("1100")
b.any(),b.test(pos),b.set(pos,v),b.reset(pos),b.filp(pos),b.to_string()


正则表达式regex
我们可以将正则表达式本身看作是用一种简单程序设计语言编写的“程序”。


随机数
旧式:
srand(time(NULL));
rand();
新库:
uniform_int_distribution<unsigned> u(0, 9);
default_random_engine e(time(0));
for (int i = 0; i < 10; i++)
{
cout<<u(e)<<" ";
}
cout<<endl;


uniform_real_distribution<double> u1(0, 1);
default_random_engine e1;
for (int i = 0; i < 10; i++)
{
cout<<u1(e1)<<" ";
}
cout<<endl;


IO库再探
格式化输入与输出
cout<<showbase;
cout<<"hex:"<<hex<<20<<" "<<1024<<endl;
cout<<noshowbase;


用于大型程序的工具
异常处理
痛苦。从网上容易找到一些公司/组织的C++编码规范,其中至少 Google、Mozilla、Qt、LLVM 这几家的规范是明确禁用异常的。
命名空间
namespace YOU_SP{ }
using namespace YOU_SP;
多重继承和虚继承
多重继承:从多个直接基类中产生派生类的能力。
虚继承:尽管在派生列表中同一个基类只能出现一次,但实际上派生类可以多次继承同一个类。
不谨慎的使用多重继承会导致‘共同祖先’问题,比如class B 和class C均继承class A, 那么如果class D 同时继承class B 和class C,
那么继承与A中的共有成员就会有两份,那么D中的成员id归属问题就不明确了。
通过虚继承的机制解决上述问题,虚继承的目的是令某个类做出声明,承诺愿意共享它的基类;
其中,共享的基类子对象称为虚基类,在这种机制下,不论虚基类在继承体系中出现了多少次,在派生类中都只包含唯一一个共享的虚基类子对象。
虚派生只影响从指定了虚基类的派生类中进一步派生出的类,它不会影响派生类本身。
class B : public virtual A{}
class C : public virtual A{}
class D : public B, public C, public G{}


特殊工具与技术
控制内存分配
重载new和delete
运行时类型识别RTTI
typeid
dynamic_cast
枚举类型
enum class open_modes { input, output, append};
enum color {red, yellow, green};
enum {red1m yellow1, green1};
类成员指针
   成员数据指针
Test t, *pt=&t;
int Test::*pData = &Test::ti;
int pti = t.*pData;
int pti2 = pt->*pData;
cout<<pti<<pti2<<endl;
   成员函数指针
void (Test::*pfun)(int);
pfun = &Test::fun;//此两行可合并成一行auto pfun = &Test::fun;
(t.*pfun)(2);
(pt->*pfun)(2);
   将成员函数用作可调用对象
考虑到必须使用.*()或者->*()来调用成员指针,对于泛型函数来说,直接使用()来说,不可实现
使用function生成一个可调用对象
嵌套类
嵌套类是一个独立的类,与外层类基本没什么关系,嵌套类的名字在外层作用域中是可见的,在外层类作用域之外是不可见的。
联合union
一种节省空间的类:一个union可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。
局部类
定义在某个函数内部的类,局部类中不允许声明静态数据成员,且不能使用函数作用域中的变量,lambda类似一种具备可调用对象类。
固有的不可移植的特性
低层编程,不可移植指因机器而异的特性。

0 0