c++ 学习笔记

1,引用在声明时必须初始化。
2,所有对象共享同一个静态常量——c++ primer plus 第五版 p327,10.8之前
3,关于const常量总结——http://blog.csdn.net/Eric_Jo/article/details/4138548#0-qzone-1-83534-d020d2d2a4e8d1a374a433f596ad1440
4,不能定义unsigned double 或 unsigned float类型
5,遇到错误
error: ‘string’ does not name a type
person.h:16: error: ISO C++ forbids declaration of ‘string’ with no type
person.h:16: error: expected ‘,’ or ‘...’ before ‘&’ token
解决办法:using namespace std / using std::string;
6,不要返回指向局部变量或临时对象的引用。函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据。
7,友元函数只有在类声明中的原型中才能使用friend关键字。除非函数定义也是原型,否则不能在函数定义中使用该关键字。
8,静态数据成员在类声明中声明,在包含类方法的文件中初始化。初始化时使用作用于操作符来指出静态成员所属的类。但如果静态成员是整型或美剧型const,则可以在类声明中初始化。
9,只能有一个默认构造函数
10,新建一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用。由于按值传递对象将调用复制构造函数,因此应该按引用传递对象。这样可以节省调用构造函数的时间以及存储新对象的空间。
11,静态成员函数
12,空指针可以是0或NULL,C语言知识NULL
13,调用析构函数小结 —— C++ primer plus  p403
14,布局new操作符
15,不能将成员初始化列表句法用于构造函数之外的其他类方法。
16,strcpy_s是微软的函数
17,派生类:
基类对象首先被创建
派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数
派生类构造函数应初始化派生类新增的数据成员
派生类对象过期时,程序将首先调用派生类析构函数,然后再调用基类析构函数
18,如果要在派生类中重新定义基类的方法,通常应将基类方法声明为虚拟的。这样,程序将根据对象类型而不是引用或指针的类型来选择方法版本。为基类声明一个虚拟析构函数也是一种惯例。(c++ plus p440)
19,指向基类的引用或指针可以引用派生类对象,而不必进行显式类型转换。
20,如果在基类中没有将ViewAcct()声明为虚拟的,则bp->ViewAcct()将根据指针类型(Brass *),而调用Brass::ViewAcct()--静态联编;如果在基类中将ViewAcct()声明为虚拟的,则bp->ViewAcct()根据对象类型(BrassPlus)调用BrassPlus::ViewAcct()--动态联编。   p449
21,构造函数不能是虚函数,析构函数应当是虚函数,除非类不用做基类。通常应给基类提供一个虚拟析构函数,纪实它并不需要析构函数。
22,从Ellipse和Circle类中抽象出他们的共性,将这些特性放到一个抽象基类中。然后从该抽象基类中派生出Circle和Ellipse类。C++通过使用纯虚函数提供未实现的函数。纯虚函数声明的结尾处为=0.当类声明中包含纯虚函数时,则不能创建该类的对象。包含纯虚函数的类只用作基类。要成为真正的抽象基类,必须至少包含一个纯虚函数。 p455
23,13.7 继承和动态内存分配没看明白
24,派生类使用基类的友元函数,强制类型转换 (p465)
25,构造函数,析构函数,友元函数不能继承
26,常见错误:warning:deprecated conversion from string constant to 'char *'解决方案:http://www.cnblogs.com/kaituorensheng/p/3575403.html
27,explicit关键字:http://www.cnblogs.com/ymy124/p/3632634.html
28,*****一个参数调用的构造函数将用作从参数类型到类类型的隐式转换函数。
29,虚基类使得从多个类(它们的基类相同)派生出的对象只继承一个基类对象。
30,虽然可以为类模板类型参数提供默认值,但不能为函数模板参数提供默认值。不过,可以为非类型参数提供默认值,这对于类模板和函数模板都是适用的。
31,boost date_time 编译时需要加上 -lboost_date_time
32,一个函数一经声明为virtual虚函数,它在继承类中的重载函数也是虚函数,不必再用virtual进行修饰。
33,后缀操作符定义中的参数类型必须为int,否则提示编译错误。(C++STL开发技术导引,p9)
34,函数模板的完全特化是在函数模板定义出来后,再用关键字“template<>”开头,给出特定类型下的函数模板定义。
35,在两个靠在一起的模板尖括号(即>)之间留一个空格,否则,编译器将会认为你是在使用operator>>,而这将会导致一个语法错误。
36,为了特化一个类模板,你必须在起始处声明一个template<>,接下来声明用来特化类模板的类型。
37,对于那些在基类中声明,并且依赖于模板参数的符号(函数或者变量等),你应该在它们前面使用this->或者Base::。如果希望完全避免不确定性,你可以(使用诸如this->和Base::等)限定(模板中)所有的成员访问。(C++template简体中文版,p41)
38,函数模板并不支持模板的模板参数(C++template简体中文版,p47)
39,在类的静态成员函数代码中,不能使用指向本对象的this指针。
40,遇到错误:warning: multi-character character constant
原因:用单引号包含多个字符
解决办法:用双引号代替
41,cout << typeid(*this).name() << endl; 打印的是:类名字符数+类名。
42,报错: error while loading shared libraries: libboost_thread.so.1.60.0: cannot open shared object file: No such file or directory
解决办法:export LD_LIBRARY_PATH="/usr/local/lib"   (因为boost的动态链接库安装的时候拷贝到了这里)
43,报错:/usr/local/gcc/libexec/gcc/x86_64-unknown-linux-gnu/4.8.2/cc1plus: error while loading shared libraries: libmpc.so.2: cannot open shared object file: No such file or directory
解决办法:export LD_LIBRARY_PATH="/usr/local/gcc/mpc-0.8.1/lib"
44,编译(./configure)protobuf错误:c compiler work: no   
解决办法:yum groupinstall "Development Tools"

45,pugixml配置 
只需要将pugiconfig.hpp , pugixml.hpp 拷贝到/usr/include 即可

46,Error 1 error C2039: 'mt19937' : is not a member of 'std".
解决办法:#include 
47,使用make_unique需要加头文件

48,priority_queue 对于基本类型的使用方法相对简单。
他的模板声明带有三个参数,priority_queue
Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。

49,cv.wait(lock, [] { return ready; }); 相当于:while (!ready) { cv.wait(lock);}

50,问题:请教static const char * const muxer_names[]的含义

答:
muxer_names是个名字

常量指针保证名字不能改

指针常量保证名字只能在初始化赋值

static保证域外无法引用(比如全局的话,文件域,其他文件无法引用这个名字)

意义就是提高了这个名字本身和访问的安全性
51, C++面试问题github集锦:https://github.com/zhaoyong26/interview
52, 类的const成员变量必须在构造函数的参数初始化列表中进行初始化
53, &&是右值引用的意思
54, boost::bind(&MyNode::doneCb, this, _1, _2)意思就是this -> doneCb(x, y) 这里的x,y 分别为第一个和第二个输入参数
55, CONFIG += console (Windows用户)
只有针对Windows平台才需要一行
CONFIG += console
其作用是告诉编译器要建立一个“控制台”应用,这种应用能够通过标准的输入/输出流与用户交互。如果使用的是 MS Dev studio,则这个设置与菜单选项 Project Properties->Configuration Properties->Linker->System->Subsystem->Console 等价。
如果没有这个选项,就不会看到发送给 qDebug(),stdout 或者 stderr 的消息。
56, boost条件变量timed_wait写法,boost::condition_variable test_condition
    1:test_condition.timed_wait(lock, get_system_time() + posix_time::seconds(3))
    2:test_condition.timed_wait(lock, boost::posix_time::millisec(3))
57, error C2338: No Q_OBJECT in the class with the signal
该类没加 Q_OBJECT
58, const *p 
可以记忆为const (*p),p指向地址的内容不可改变,但是p指向的地址是可以改变的这就是sort函数可以进行排序的原因 
*const p 
可以记忆为*(const p),const修饰的地址,p指向的地址不可改变,但是p指向地址的内容可以改变
    

 

你可能感兴趣的:(c++,笔记)