two
指针
一、认识指针
例如:int* p;
其中p为int类型,即整数指针类型
例如:
int i=20;
intp;
p=i;//error:不能把int赋值给int*。
p=&i//true
此时p为指针
std::cout<< *p <<std::endl;//此时的 *p为 i 值
二、const限定符
const int size=1024;//这样size便被定义为一个常量若->
size=24;//error:左值不可修改。
默认const只在文件内有效,但有时我们需要他在多文件中可用,只需在其前声明为extern即可。
例如: extern const int i;
三、&引用符
const int &r=i;
即将r于i绑定,r为对i的引用。
四、指针的顶层const和底层const
(1)顶层const:int *const p=&i;
例如:
int j;
p=&j;//error:左值不可修改
*p=j;//true
(2)底层const:const int *p=&i;
例如:
p=&j;//true
*p=j;//error:左值不可修改
(3)constexper:便于编译器验证变量的值是否是常量表达式。
只有字面值类型可以被定义为constexper。
constexper int *p=nullptr;限定符constexper仅对指针有效,与指针所指的对象无关。
四、类型别名typedef和using
typedef int wages;
using wages=int;
指针、常量和类型别名
typedef char *pstring;
const pstring cstr=0;
不能理解为const char cstr=0;
因为pstring其基本数据类型是指针。用
char重写后基本数据类型成了char,前者声明了一个指向char的常量指针,改写后则声明了一个指向const char的指针。
五、auto类型说明符
其作用是让编译器替我们去分析表达式所属的
类型,所以auto定义的类型必须初始化。
auto i=0;
其次,auto一般会忽略掉顶层const,底层
const则会保留,因此想保留顶层则需要const auto i=0;
六、decltype类型指示符
decltype作用是从表达式的类型推断要定义的变量类型但不用表达式的值初始化变量。
decltype(fun()) sum = x;//sum的类型就是函数fun的返回类型
decltype((i)) d;//error:双层括号表示引用,必须初始化。
七、自己编写头文件
预处理器概述
确保头文件多次包含仍能安全工作的常用技术是预处理器(preprocessor),它由C++语言从C语言继承而来。预处理器是在编译之前执行的一段程序,可以部分地改变我们所写的程序。之前已经用到了一项预处理功能#include,当预处理器看到#include标记时就会用指定的头文件的内容代替#include。
C++程序还会用到的一项预处理功能是头文件保护符(header guard),头文件保护符依赖于预处理变量。预处理变量有两种状态:已定义和未定义。#define指令把一个名字设定为预处理变量,另外两个指令则分别检查某个指定的预处理变量是否已经定义:#ifdef当且仅当变量已定义时为真,#ifndef当且仅当变量未定义时为真。一旦检查结果为真,则执行后续操作直至遇到#endif指令为止。

第一次包含Sales_data.h时,#ifndef的检查结果为真,预处理器将顺序执行后面的操作直至遇到#endif为止。此时,预处理变量SALES_DATA_H的值将变为已定义,而且Sales_data.h也会被拷贝到我们的程序中来。后面如果再一次包含Sales_data.h,则#ifndef的检查结果将为假,编译器将忽略#ifndef到#endif之间的部分。

浙公网安备 33010602011771号