第八章

来源:互联网 发布:淘宝货到付款发货流程 编辑:程序博客网 时间:2024/04/28 04:21
1.预处理器只做些文本替代
2.c++中的const变量默认为内部链接,当定义一个const时,必须赋一个值给它(函数返回的值也可以),除非作出了extern说明,由于是内部链接,所以多个编译单元里同名不会发生名字冲突
extren const intbufsize;
3.通常c++编译器并不为const创建存储空间,相反它把之歌定义保存在它的符号表里,但是上面的extern强制进行了存储空间分配(另外一些情况,如取一个const的地址,也要进行存储空间分配),由于extren意味着使用外部链接,因此必须分配存储空间,这也就是说有不同的编译单元应当能够引用它,所以它必须有存储空间
4.const可以用以聚合,你要相信编译器不会真的把一个聚合保存到它的符号表里,所以必须分配空间
struct S { int i, j; };
const S s[] = { { 1, 2 }, { 3, 4 } }
5.正如任何复杂的定义一样,定义指针的技巧是在标识符的开始处读它并从里向外读
指向const的指针
const int* u; int const* u;
const指针
int d = 1;
int* const w = &d;
6.“*”有时是与标识符结合,有时是与类型结合的,看情况int *num;int* f();
7.char* cp="howdy";
编译器将接受它而不报告错误,从技术上讲,这是一个错误,因为字符数组的字面值是被编译器作为一个常量字符数组建立的
8.
X f5() {
  return X();
}
f5()=X(1);
或者f5().modify();一旦表达式计算结束,该临时对象也会不复存在。
9.
class X {};
X f() { return X(); } // Return by value
void g1(X&) {} // Pass by non-const reference
void g2(const X&) {} // Pass by const reference
/////////////////////////////////////接受临时变量的引用必须是const引用
int main() {
  // Error: const temporary created by f():
//!  g1(f());
  // OK: g2 takes a const reference:
  g2(f());
} ///:
10.const成员函数只能为const对象调用
11.类里的const:在一个类里建立一个普通的(非static的)const时,不能给它初值,这个初始化工工作必须在构造函数里进行,当然,要i在构造函数的某个特别的地方进行
#include <iostream>
using namespace std;
class Fred {
  const int size;
public:
  Fred(int sz);
  void print();
};
Fred::Fred(int sz) : size(sz) {}
void Fred::print() { cout << size << endl; }
int main() {
  Fred a(1), b(2), c(3);
  a.print(), b.print(), c.print();
} ///:~
12.
13.类的const函数声明和定义处都得加上const,对const函数的要求:仅仅是不修改数据
14.一个没有被明确声明为const的成员函数被看成是将要修改对象中数据成员的函数
15.不修改数据成员的任何函数都应该把它们声明为const,这样它可以和constr对象一起使用
16.非const对象可调用aconst函数 b非const函数。。。cosnt对象只可调用const函数
有两种由内部const成员函数改变数据成员的方法a使用this引用数据  b加上mutable
a方法
 class Y {
  int i;
public:
  Y();
  void f() const;
};
Y::Y() { i = 0; }
void Y::f() const {
//!  i++; // Error -- const member function
  ((Y*)this)->i++; // OK: cast away const-ness
  // Better: use C++ explicit cast syntax:
  (const_cast<Y*>(this))->i++;
}
b方法
class Z {
  int i;
  mutable int j;
public:
  Z();
  void f() const;
};
Z::Z() : i(0), j(0) {}
void Z::f() const {
//! i++; // Error -- const member function
    j++; // OK: mutable
}
17.volatile的语法与const是一样的,但是volatile的意思是“在编译器认识的范围外,这个数据可以被改变”









































原创粉丝点击