小知识点杂记
1.QString与本地std::string之间的转换
std::string s=qstr.toStdString();
QString qstr=QString::fromStdString(s);
2.Qt中遇到error:LNK2019:无法解析的外部符号
有可能是因为之前编译出错了之后改正了代码没有覆盖生成.obj文件(猜测)。将debug/release文件夹删了,重新编译运行。
3.头文件中一定不要有实现。
写头文件的时候一定要把对应实现写在.cpp源文件里,不要写在头文件里,头文件里只有声明。那么这里有个问题,泛型的头文件为什么可以写实现?首先泛型函数的函数体不能写在另一个文件里,泛型编程是这么规定的,但是泛型函数的函数体应该并不算真的实现,因为只有调用的时候确定了类型才可能实现这个函数,泛型函数的函数体只是给编译器一个模板告诉它怎么生成定义;那么含有泛型的头文件可以有.cpp源文件吗?显然可以,比如含有泛型的头文件中还有一些其他的非泛型函数,这些函数的实现还是必须在.cpp文件里。
4.在.cpp文件中定义类
我们知道在.h对应的.cpp文件中定义的类不能在外部使用,因为其他文件只包含了.h文件,所以不能使用在相应的.cpp中定义的类(要么是出现未定义的标识符错误提示,要么是不允许使用不完整的类型错误——这是在.h文件中有前置声明的情形),这样有一个好处是如果想定义个类只是作为包含的.h文件中主要类的支持类,不想其为外部使用,可以将其定义在对应.cpp文件中。
5.函数不改变的形参设为const参数,类成员函数不改变成员变量时设为const函数
我觉得这是一个好习惯,既表明了函数不改变形参或成员变量的意图,又可以兼容使用const的实参。
6.*&和&*是什么意思
就是直观的意思,*&表示先取地址后解引用,&*表示先解引用后取地址。解引用后取地址,取地址后解引用,那不是还是自己,何必多次一举?其实不一定。比如函数的参数为double *&p表示这个参数是一个指向double型指针的引用;再比如std::vector<double>::iterator it=v.begin();//v为对应类型vector,而有另一个函数void fun(double *),则可使用fun(&*it),先是对迭代器解引用得到元素,后取地址成为指向元素类型的指针,这里&*并没有得到iterator本身是因为iterator重载了*。
7.保存指针的vector可以压入NULL空指针吗?
可以。只要记得使用前判定是否为NULL就好了。