||
组里开了一个代码研讨会,现记载一下会议内容:
第一部分是C++基础:
类的静态成员,不属于任何对象,属于整个类,可以用作用域运算符直接访问,也可以用对象调用。一般来说,类里面只能对静态成员声明,在类的外部定义和初始化类的每个静态成员,注意,在类外定义静态成员时不要重复static关键字。静态数据成员只能被定义一次,为了保证这一点,可以将其放在对应的.cpp文件中。
静态变量:
class Account {
private:
double static interestRate; //声明
double static initRate( ); //声明
}
在.cpp中定义初始化
double Account::interestRate = initRate();
对于常量静态数据成员可以在类内初始化,通常也要在类外部定义一下该成员。
静态函数:
可在类内定义,也可在类外定义,不能重复static关键字。
note: 静态成员可用,普通成员不可用的场景:
class Bar {
private:
static Bar mem1; //R
Bar *mem2;//R
Bar mem3;//W
}
局部静态变量
可控制静态变量定义的顺序,lazy策略,如果不被调用,就不构造。
比如,函数里定义的static变量,在程序第一次经过定义语句时初始化,只初始化一次。
仿函数
就是重载了函数调用运算的类。
虚函数
所有基类的析构函数必须是虚函数,虚函数应一致标明。注意在类外实现时,不要加上virtual关键字.
lexical_cast
boost库中将字符串自动转为数字的函数,会自动检查字符串到底是不是数字.
int i = boost::lexical_cast<int>("123");
double d = boost::lexical_cast<double>("12.3");
static_cast:任何具有明确定义的类型转换,只要不包含低层const都可以使用
double slope = static_cast<double> (j)/i;
dynamic_cast:用于将基类指针或引用安全的转换为派生类的引用和指针
if(Derived *dp = dynamic_cast<Derived> bp)
如果基类指针bp指向派生类对象,就赋值成功.
tip:
对vector的遍历,尽量使用迭代器或BOOST_FOREACH,合理使用typedef,typename;
typedef 与using:在C++11都可用于定义类型的别名(ps,引用是对象别名).
typedef int INT;typedef struct msg {
double sd;等价于:
struct msg在标准 C++,typedef 可定义模板类型一个新的类型名称,但是不能够使用 typedef 来定义模板的别名。举例来说:
template<typename first, typename second, int third>
class SomeType;
template<typename second>
typedef SomeType<OtherType, second, 5> TypedefName;// 在C++是不合法的
这不能够通过编译。
为了定义模板的别名,C++11 将会增加以下的语法:
template<typename first, typename second, int third>
class SomeType;
template<typename second>
using TypedefName = SomeType<OtherType, second, 5>;
using 也能在 C++11 中定义一般类型的别名,等同 typedef:
typedef void(*PFD)(double);// 傳統語法,定义函数类型指针
using PFD =void(*)(double);// 新增語法
typename:告诉编译器这是一个型别.
典型用法:
template <class I>
struct iterator_traits {
typedef typename I::iterator_category iterator_category;
...
};
第二部分:讲解了一下Google编程规范,这个百度就可以找到。
参考文献:
http://blog.csdn.net/y_xianjun/article/details/10214451
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-7-17 21:43
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社