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;
}