liyanbo的个人博客分享 http://blog.sciencenet.cn/u/liyanbo

博文

代码研讨会1

已有 1622 次阅读 2016-2-24 20:44 |个人分类:C++|系统分类:科研笔记

组里开了一个代码研讨会,现记载一下会议内容:

第一部分是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;
double sdf;
} msg, *gg;

等价于:

struct msg
{ 
double sd;
double sdf;
} ; 
typedef struct msg  msg ;
typedef struct msg * gg ;

在标准 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



https://blog.sciencenet.cn/blog-1515646-957886.html

上一篇:师姐代码心得-1解析命令行
下一篇:代码研讨会3
收藏 IP: 159.226.43.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-7-17 21:43

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部