前言
自从学习到工作,使用c++已近7个年头,其中所遇疑难杂症数不胜数。以往遇难题,即查之,又忘之,犹如过眼云烟。现痛定思痛,将所遇之困惑、易成bug之代码一一记。一为留个念想,证明世间吾曾来过呼,二则未来遇类似之问题,以便查阅。
c++不具名命名空间
- 命名空间是用来防止对象重复定义的。
- 不具名命名空间也是防止对象重复定义的,只是没有名字而已
- 不能在头文件中书写不具名命名空间
- 在cpp 中写不具名命名空间,本文件中是可以直接使用,别的文件无法使用。
namespace
{
int x;
int y;
int myfun();
}
utf8、utf8 BOM、utf8带签名
- UTF-8 BOM与UTF-8带签名指的是同一回事,二者指的是UTF-8的同一格式
- UTF-8 BOM中的BOM,全称为Byte order mark。
- 带BOM(签名)的UTF-8文本文件与不带BOM的UTF-8文本文件的区别在于:前者在文件的开头有3个字节 EF BB BF
- 在windows平台上,默认的utf-8格式文本都是带BOM的,并且文本编辑器都能识别BOM;而在其他的平台,比如Linux下的文本处理器很可能是不识别BOM的,会导致文件的第一行读不出来。而一般上认为不带BOM的utf-8格式是标准格式。
- 不带bom的文本才是标准的utf8
DML是个啥呢?
- 他是数据操作语言,记录表的操作(增、删、改)
回调函数的区别
- callback 面向过程的, C语言
- sink 面向c++接口的,需要实现一个类。
- delegate 设置类的成员函数。。
typedef 和typedef typename 的区别
typedef
- typedef是用于定义类型的
typedef list<int> ListNum; listNum num{ 1,2,3,4};
- 定义指向成员的指针
class Foo { public: void f() { } private: int a; }; typedef void(A::*fp)(); // fp为函数指针的别名
typename
- typename T;表示T的定义还没有给出,这个语句通常出现在模版的定义内
typedef typename T::a TA; // 这里不指定变量 T是一个未声明的类型,为泛型,只有等确定了T的类型 就可以替换 Foo::a TA ta; // 声明ta,类型为T::a typename T::a a; // 声明a 的类型为T::a // typedef typename 这句话的意思就是: typedef重新定义别名,typename确
- template ; 表示T是一个类型,
template<typename T> // 等价于template<Cclass T> void f(T t); ``
- typename和class的区别
- class 表明后面的符号是一个类型
- class 定义一个类
- 模板引入c++后,最初定义模板的方法为: template……在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,
- 总结
- typename 后面标识一种类型。这种类型暂时还不知道,只有实例化模板之后才能确定该类型
- typedef 重定义别名, typedef typename 就是 重定义一种还没有确定的类型的别名。typedef typename T U, 就是把T这种类型重定义别名为U。
- typedef typename 作用
template < class T > void Foo( T arr) { // 告诉c++编译器,typename后面的字符串为一个类型名称,而不是成员函数或者成员变量 // 加入没有typename 编译器不知道T::length 是类型还是类的成员 typedef typename T::length LengthType ; LengthType length = arr.GetLength ; }
C++类对象为nullptr是可以调用成员方法的,只要不是访问成员变量,是不会报错的。如果访问成员变量即crash
#include <iostream>
using namespace std;
class person
{
public:
person()
{}
person(string a = "", int b = 12)
:name(a), age(b)
{}
void test()
{
cout << "这是test" << endl;
}
void change()
{
cout << "这是change" << endl;
cout << name.c_str() << endl;
}
~person()
{}
private:
string name;
int age;
};
//
void test()
{
person A("sss",13);
person B("sddd", 15);
person* p = nullptr;
A.test();
A.change();
p->test();
p->change();
}
int main(int argc, const char * argv[]) {
test();
return 0;
}