effective C++ 读书笔记(0-2)

1: 

 const int * ptr 指向常量(read only)的指针

       对指针重新赋值可以

       对指针指向的内容重新赋值不行

 int * const ptr 指向的指针常量

2: 

     在类的声明中 声明一个 static const 型成员变量 是可以的

     class A

{

private:

static const int num = 5;

int Array[num];

};

这里对于变量 num 不需要 在定义就可以使用

但注意这里 只能声明 const型的成员变量

对于 static 非const 成员变量

class A

{

private:

static int num = 5;

int Array[num];

};

这样子会报错!
..\/basic.h:15:19: error: ISO C++ forbids in-class initialization of non-const static member 'num'
..\/basic.h:16:15: error: array bound is not an integer constant before ']' token

解决办法 就是在.cpp文件中 定义咯~

4:

 the enum hack

 看起来好像 这和 static const unsigned  成员变量 没什么区别

class A

{

public:

static const int num = 5;

enum {numEnum = 5};

int scores[num];

int shit[numEnum];

};

  但实际上 enum 的内容与define 很类似 

  取一个 static const int 成员变量的值是合法的 

 但是取一个 enum 或是 define 出来的变量的值是不合法的

int main()

{

A a;

cout<<&a.num<<endl;

cout<<&a.numEnum<<endl;  //error!

return 0;

}

enum分配出来的东西不会导致额外的内存分配
5:
 (1) 对于C-like 类型而言 (也即是 内置类型
 pass-by-value 往往比 pass-by-reference 高效
(2)但是对于C++ 来讲 由于存在 构造与析构函数
 pass-by-reference-to-const 往往更高效
(3)对于template C++而言更是如此 应为我甚至不知道所处理对象的类型
     所以pass-by-reference-to-const 比较好
#ifndef BASIC_H_
#define BASIC_H_
#include <iostream>
using namespace std;
class A
{
public:
static const int num = 5;
enum {numEnum = 5};
int scores[num];
int shit[numEnum];
template <class T>
inline const T& callWithMax(const T& a,const T& b)
{
return (a>b?a:b);
}
};
class B
{
public :
int a;
inline bool operator >(const B &ref) const
{
return a>ref.a;
}
friend ostream& operator <<(ostream &os,const B &ref);
B(int temp):a(temp){};
};
#endif /* BASIC_H_ */
#include "basic.h"
ostream & operator <<(ostream & os,const B &b)
{
cout<<b.a<<endl;
return os;
}
#include <iostream>
#include <list>
#include <map>
#include "basic.h"
using namespace std;
int main()
{
A a;
B b1(1),b2(2);
cout<<a.callWithMax(b1,b2)<<endl;
return 0;
}

posted @ 2011-09-07 11:10  王帅901  阅读(889)  评论(0编辑  收藏  举报