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

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

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

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


  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};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值