C++学习笔记(二)

本期话题:字符串文字常量,指针,引用

1、关于字符串文字常量
 sizeof("Bohr") == 5
 字符串文字常量的类型是“适当个数的const字符的数组”,所以"Bohr"的类型就是const char[5]
 下面的赋值是可以的:char* p = "Bohr";因为在C/C++原来的定义里,字符串文字常量的类型就是char*
 字符串文字常量是静态分配的,他们被分配在程序的静态数据区,所以让函数返回字符串文字常量是安全的。
 [code = c/c++]
 const char* test()
 {
  // ...
  return "test finish!"; // 正确,该字符串文字常量不会随函数的结束而销毁(因为它被分配在程序的静态数据区)。
 }
 [/code]
 两个相同的字符串文字常量是否被分配在一起,取决于编译器实现。
 [code = c/c++]
 const char* p = "test";
 const char* q = "test";
 if (p == q) cont<<"one!/n"; // 结果随编译器而不同
 [/code]
 为使程序简洁,可以将长字符串分开书写,下面的书写方式也是正确的:
 [code = c/c++]
 char alpha[] = "abcdefgh"
     "ijklmn";
 [/code]

2、常量在定义时必须进行初始化 
 [code = c/c++]
 const int num = 100;  // ok
 const int x;    // wrong!
 [/code]

3、常量指针和指针常量
 [code = c/c++]
 char* const cp; // 指向char的const指针
 char const* cp; // 指向const char的指针
 const char* cp; // 指向const char的指针
 [/code]
 可以这样理解:*代表指针,按照自右向左的顺序阅读。
 cp is a const pointer to char
 cp is a pointer to char const
 cp is a pointer to const char
 char const和const char是一样的。

4、不能将常量的地址赋给一个未加限制的指针
 [code = c/c++]
 const int c = 2;
 int* pi = &c;  // 错误:用const int* 来对int* 进行初始化
 *pi = 3;    // 这样,就造成来常量c的值可以被修改
 [/code]

5、引用
 引用的最明显的(也是最简单和最自然的)一种实现方式是作为一个常量指针,每次使用它的时候都自动做间接访问。所以:
 [code = c/c++]
 int ii = 0;
 int& rr = ii;
 rr++;     // 是对ii加1,而不是将rr指向下一个位置
 int* pp = &rr;  // pp指向的是ii
 [/code]
 一些情况下,引用可以通过编译器的优化而去掉,使得在执行时根本不存在任何表示引用的东西。
 引用在使用时必须初始化,对普通的T& 的初始式必须使用一个类型T的左值。左值是一个对象,可以取得它的地址。
 [code = c/c++]
 double& dr = 1; // 错误:要求左值
 [/code]
 但是,const T& 的初始式不必是左值
 [code = c/c++]
 const double& cdr = 1; // ok
 [/code]
 这相当于
 [code = c/c++]
 double temp = double(1); // 首先建立一个具有正确值的临时变量
 const double& cdr = temp; // 用临时变量作为引用的初始式
 [/code]
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值