1. 利用宏 DISALLOW_EVIL_CONSTRUCTORS(ClassName)禁止类对象拷贝和赋值操作
路径\talk\base\constructormagic.h文件定义了如下若干宏:
#define DISALLOW_ASSIGN(TypeName) \
void operator=(const TypeName&)
// A macro to disallow the evil copy constructor and operator= functions
// This should be used in the private: declarations for a class
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
DISALLOW_ASSIGN(TypeName)
// Alternative, less-accurate legacy name.
#define DISALLOW_EVIL_CONSTRUCTORS(TypeName) \
DISALLOW_COPY_AND_ASSIGN(TypeName)
// A macro to disallow all the implicit constructors, namely the
// default constructor, copy constructor and operator= functions.
//
// This should be used in the private: declarations for a class
// that wants to prevent anyone from instantiating it. This is
// especially useful for classes containing only static methods.
#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
TypeName(); \
DISALLOW_EVIL_CONSTRUCTORS(TypeName) 在类的private片断内, DISALLOW_EVIL_CONSTRUCTORS和DISALLOW_COPY_AND_ASSIGN预处理阶段最终转变为:
private:
// 私有拷贝构造函数
TypeName(const TypeName&);
// 私有赋值操作运算符
void operator=(const TypeName&) 而宏 DISALLOW_IMPLICIT_CONSTRUCTORS更进一步,将空构造函数也设为私有,禁止从外部初始化该类的对象 :
private:
// 私有空构造函数,禁止从外部通过此方法创建对象
TypeName();
// 私有拷贝构造函数
TypeName(const TypeName&);
// 私有赋值操作运算符
void operator=(const TypeName&)
2. 去除字符串string前后空白字符函数trim
base\stringutils.h定义了若干字符串操作函数,如字符串匹配、字符串比较、去除前后空白字符等,这次看一下去除前后空白字符的函数。
首先定义要识别的空白字符:可以看到需要去掉的字符包括, 空格符、回车换行符、回车符和制表符四种。
static const char kWhitespace[] = " \n\r\t";
然后是具体函数实现:
std::string string_trim(const std::string &s)
{
std::string::size_type first = s.find_first_not_of(kWhitespace);
std::string::size_type last = s.find_last_not_of(kWhitespace);
if ( first == std::string::npos || last == std::string::npos )
{
return std::string("");
}
return s.substr(first, last - first + 1);
}
可以看到主要利用std::string::find_first_not_of 和 find_last_not_of 这两个函数,分别找到第一个和最后一个不是函数参数中任何一个字符的首位置。
简单判断找到位置的有效性,然后返回子字符串。
3. etd
4. etd
|