`
xiongx
  • 浏览: 13440 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

《c++ primer 4th》--ch12--类和数据抽象

阅读更多
  所有成员必须放在类的内部声明。好处是编译的时候就能知道分配多大的储存空间。、

  const必须同时出现在类成员声明和定义处(包括函数后面的const)。与它刚好相反的是static,只能在放在声明处(如果放在了定义处,和C语言中static 表示internal linkage的含义有冲突了)。

  inline只是一个编译提示,具体参见:http://www.informit.com/blogs/30-C-Tips-in-30-Days-Tip-3-inline-Dos-and-Donts-


  class定义后面必须加上分号是为了和struct保持一致,class后面能够定义变量。例如:
class Sales_item{/*......*/} accum,trans;

  在const成员函数中,this的类型是一个指向const类类型对象的const指针。因此不能从const成员函数返回指向类对象的普通引用。

  构造函数不能声明为const。
  和java不一样,非static的类数据成员的初始化只能放在初始化列表(ctor initializer)中,在构造函数体执行前执行。
  ctor initializer只在构造函数的定义中而不是声明中指定。
  在ctor initializer中没有显示提及的每个成员,都使用与初始化变量相同的规则:对于类类型的成员,如果初始化列表没有显示初始化,则会隐式调用这些成员的默认构造函数,对于内置和复合类型,成员的初始值依赖于对象的作用域。
  ctor initializer的执行顺序是定义成员的次序(这一点和java相同)。
  和java不一样的是c++的构造函数之间的调用。例如:
class A{
public:
	A():i(2){}
	A(int i):i(i){
		this->i+=2;
		A();
	}
	int i;
};
A a(1);    //只执行A(int i):i(i)的ctor initializer。A();被当成了普通函数处理。

  java中this()必须写在第一行,c++没有这个限制。

  c++和c语言中一样,能够在函数内部声明函数,这一点造成了用一个默认构造函数初始化一个命名对象时,不能加上(),否则编译器会把它当成了一个函数声明。
string s(); //声明了一个名为s,无参数,返回值为string类型的一个函数


  对于static的数据成员,在类内部的说明只是declare而不是define,它们的定义放在类定义外部(成员定义隐含分配存储空间的意思,static成员的存储空间不属于它所在的class)。比较特殊的是integral or const enumeration类型的static const成员,它们的定义可以写在class定义的内部,但为了统一,建议还是在外部定义static成员。
  刚看完这个的时候有点马虎,以为所有的static const成员都能够在类内部初始化,于定义了一个int数组,死活不能通过编译,把定义放在类外部就可以了
class A{
public:
	static const int i[];
	static const int i[]={1,2}; // error
};
const int A::i[]={1,2};

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics