C++步步为营

C++---CHAPTER 2 : VARIABLE

2019-07-10  本文已影响0人  世界上的一道风
int unit_sold = {0};  // list initialization
long double ld =3.14159;
int a{id}, b = {id}; //错误
int c(id), d = ld; // 正确
extern int i; //声明而非定义i
int j; //声明并定义j
extern double pi = 3.1416; // 定义
int ival = 1024;
int &refVal = ival; 
int &refVal2; // 报错
int ival = 42;
int *p = &ival;  // &取地址符,p存放变量ival的地址。
cout << *p ; // *解引用符,得到p所指的对象。
int *p1 = nullptr;
int *p2 = 0;
int *p3 = NULL; // 需要include<cstdlib>
int ival = 1024;
int *pi = &ival; // pi是指向int的指针
int **ppi = &pi; // ppi是指向int指针的指针
int i = 42;
int *p; 
int *&r = p ; //r是一个对指针p的引用

const

const限定的变量,其值不能改变,因此必须初始化。
const变量初始化另一个对象不会改变这个变量:

int i = 42;
const int ci = i;
int j = ci; //正确;拷贝完成,新的对象和原来的对象就没有关系了;
//file.cc 定义并初始化了一个常量
extern const int bufSize = fcn();
// file_1.h头文件
extern const int bufSize; // 与file.cc中定义的bufSize是同一个
const int ci = 1024;
const int &r1=ci; //正确
int &r2 =ci; //错误

const的引用可能引用一个并非const的对象:

int i = 42;
int &r1 = i;
const int &r2 =i; 
r1 = 0; //正确
r2 = 0; //错误
const double pi = 3.1415;
double *ptr = &pi; //错误
const double *cptr = &pi; //正确


double dval = 3.14;
cptr = &dval; //正确
int errNumb = 0;
int *const curErr = &errNumb; //只能指向errNumb 

const double pi = 3.14159;
const double *const pip = &pi; // pip是一个指向常量对象的常量指针

*pip = 2.72; // 错误,pip是一个指向常量的指针
* curEr = 0; // 正确,所指对象的值重置
int i =0 ;
int *const p1 = &i; // 不能改变p1的值,是一个顶层const
const int ci = 42; //不能改变ci的值,是一个顶层const
const int *p2 = &ci; // 允许改变p2的值,这是一个低层const
const int *const p3 = p2; //靠右边的const是顶层const,靠左边的是低层const
const int &r =ci; // 用于声明引用的cosnt都是低层const
constexpr int mf = 20;
cosntexpr int limit = mf +1;
constexpr int sz = size(); //只有size是一个constexpr函数时才是一条正确的声明语句

constexpr声明中如果定义指针,限定符constexpr仅对指针有效,与指针所指的对象无关:

const int *p = nullptr; // p是一个指向整型常量的指针
constexpr int *q = nullptr; //q是一个指向整型的常量指针 ,顶层const

与其他常量一样,constexpr能指向常量与非常量:

int j = 0;
constexpr int i = 42; // i的类型是整型常量

constexpr const int *p = &i ; // p是常数指针,指向整型常量i
constexpr int *p1 = &j; //p1是常量指针,指向整数j
typedef double wages; //wages 是double的同义词
using SI = Sales_item; // SI是Sales_item的同义词

一条语句声明多个变量,但是变量的初始数据类型必须一样:

auto i =0, *p = &i; //正确:i是整数、p是整型指针
auto sz=0, pi = 3.14; //错误,类型不一样

auto类型和初始值类型并不一定一样,如忽略顶层const,保留低层const

int i =0, &r = i; 
auto a = r; // a是一个整数 

const int ci = i, &cr  = ci;
auto b = ci; // b是一个整数(ci的顶层const特性被忽略)
auto c = cr; // c是一个整数 (cr是ci的别名,ci本身是一个顶层const)
auto d = &i; // d是一个整型指针(整数的地址就是指向整数的指针)
auto e = &ci; // e是一个指向整数常量的指针(对常量对象去地址是一种低层const)

希望推断出的auto类型是一个顶层const,需要明确:

const auto f = ci; //  ci的推演类型是int,f是const int

引用的类型设为auto,上述规则依然适用:

auto &g = ci; //g是一个整型常量引用,绑定到ci
auto &h = 42; //错误,不能为非常量引用绑定字面值
const auto &j = 42; //正确:可以为常量引用绑定字面值
const int ci = 0, &cj = ci;
decltype(ci)  x = 0; //x的类型是const int
decltype(cj) y = x; // y的类型是const int&, y绑定到变量x

decltype((variable))的结果永远是引用:

int i = 42;
decltype((i)) d; //错误,d是int&,必须初始化;

术语表

声明(declaration) 声称存在一个变量、函数或是别处定义的类型。名字必须在定义或者声明之后才能使用。
定义(defination) 为某一特定类型的变量申请存储空间,可以选择初始化该变量。 名字必须在定义或者声明之后才能使用。
上一篇 下一篇

猜你喜欢

热点阅读