一、 map的find用法
C++ STL参考
https://github.com/steveLauwh/SGI-STL/tree/master/SGI-STL%20V3.3
我对map的find方法好像有误解以至于在程序中调试了许久。
这里举一个例子看看:
map初始化
std::map<const char*, int> cmdMap;
cmdMap.insert(std::make_pair("CMD1", 1));
cmdMap.insert(std::make_pair("CMD2", 1));
查找元素(1):
int main()
{
const char *p="CMD2";
std::map<const char*, int>::iterator it= m_settingsMap.find(p);
if (it == cmdMap.end()){
print("找不到元素");
}
}
查找元素(2):
int main()
{
char p[32]={0};
strcpy(p,"CMD2");
std::map<const char*, int>::iterator it= m_settingsMap.find(p);
if (it == cmdMap.end()){
print("找不到元素");
}
}
结果是,第一种方法能找到元素,但是第二种方法找不到元素,这是因为find方法并不比较字节串,他只是比较了字符串首地址。
但是如果需要比较字符串key呢,所以这里key值就要用std::string类型了:
std::map<std::string, int> cmdMap;
cmdMap.insert(std::make_pair(“CMD1”, 1));
cmdMap.insert(std::make_pair(“CMD2”, 1));
二、成员变量指针
成员变量地址 传给外部指针去使用, 这种方法所以科学,但是我想应该是有效的。
但是经过测试发现,第一次赋值给指针的时候,可用通过指针访问到成员变量的值,但是接着修改了成员变量的值后,通过指针无法最新的值,而是还是之前的值,没有更新。
三、拷贝构造函数能不能用值传递
CExample(const CExample& other); //引用传递
如果使用CExample(const CExample other); 会无限递归,程序会内存耗尽。
其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。
四、如果定义了拷贝构造函数,那也必须重载赋值操作符。
CExample(const CExample& other);
CExample& operator=(const CExample& other);
CExample objA=objB; 在对象声明中使用=号,调用的是拷贝构造函数;
CExample objA; objA=objB;先声明objA,再对其复制,调用的是重载的=复制操作。
但"=“的缺省操作只是将成员变量的值相应复制。由于对象内包含指针,将造成不良后果:指针的值被丢弃了,但指针指向的内容并未释放。指针的值被复制了,但指针所指内容并未被复制。因此,包含动态分配成员的类除提供拷贝构造函数外,还应该考虑重载”="赋值操作符号。
因为系统会默认一个浅拷贝构造函数,如果不使用的话就将其声明成私有的,这样外部调用时编译器会报错
五、模板类,模板函数
模板类和模板函数的定义写在.h中,但是实现写在.cpp, 在实例化编译会出错,因为找不到函数的实现;
原因是模板跟宏类似,不会生成.o文件,要实例之后才会,写在.cpp中的模板函数没有在其他文件include导致找不到实现。 所以模板定义和对应的方法实现都应该写在头文件中。