C++ Primer第二章!
#include "stdafx.h"
#include
using namespace std;
int main()
{
bool bl = true;
char c = 'c'; //与机器字节一样,大多数机器字节由8比特构成。
wchar_t wc = 'c';
char16_t c16 = 'c'; //为Unicode字符集服务。可以储存unicode的字符,而char也只能储存ANSI字符!
char32_t c32 = 'c'; //为Unicode字符集服务。
short st = 1;
int it = 1;
long lt = 1;
long long llt = 1;
float ft = 0.1; //1字节表示,7个有效位。
double dt = 0.1; //2字节表示,16个有效位。
long double ldt = 0.1;
//应该避免混用带符号类型和无符号类型!在无符号类型进行减法运算时,应该保证不为负数!
unsigned char i1 = -1;
cout << int(i1) << endl; //unsigned char,赋值-1,所得结果为255。10000001原码-11111110反码-11111111补码
unsigned u2 = 10;
int i2 = -42;
cout << i2 + i2 << endl;
cout << u2 + i2 << endl; //int值转换为无符号值,导致异常结果
unsigned u3 = 42, u4 = 10;
cout << u3 - u4 << endl;
cout << u4 - u3 << endl; //必须确保无符号变量不可能为负值,否者会导致未知错误,当应用于循环时尤其注意。
//初始化不是赋值,初始化是创建变量时赋予一个初始值,而赋值是把对象的当前值擦除并以一个新值取代。
int i3 = 1;
int i4(1);
int i5 = { 0 }; //列表初始化,C11新规定。列表初始化,当发生精度损失时,会报告错误!
int i6{ 0 };
double pi = 3.1415926;
int i7 = pi;
//int i8{ pi }; //当初始值存在丢失信息时,使用列表初始化会报错!
//在函数体内部的内置类型变量不被默认初始化,其变量值是未定义的;在函数体之外的变量被初始化为0。所以,显示初始化变量是非常必要的!
//每个类决定其初始化对象方式,例如string默认初始化为空串。由类的默认构造函数决定!
//变量的命名规范:标识符要体现实际含义;变量名一般用小写字母;用户自定义的类名用大写字母开头;如果标识符由多个单词组成,则单词间应有明显区分。
int ival = 1024;
int &refVal = ival; //引用,即对象别名,程序将引用和它的初始值绑定。引用必须被初始化!
int *pVal = &ival; //指针,指针本身就是一种对象。但是也建议进行空指针初始化!
cout << refVal << " " << *pVal << endl;
//空指针,注意不能把int变量直接赋给指针。
int *p1 = nullptr;//c++推荐方式!
int *p2 = 0;
int *p3 = NULL;
//void*指针
void *p4;
//int *p5 = static_cast(p4);//强制类型转换。
//指向指针的指针
int ival2 = 1024;
int *p_ival2 = &ival2;
int **pp_ival2 = &p_ival2;
cout << ival2 << "-" << *p_ival2 << "-" << **pp_ival2 << endl;
//指针是对象,所以有引用
int ival3 = 1024;
int *pi_ival3 = &ival3;
int *&r_p_ival3 = pi_ival3;
//const限定符,指向常量的引用
const int ival3 = 1314; //cosnt对象创建时必须初始化!
const int ival4 = ival2; //利用一个对象去初始化const对象。
//extern const int ival5 = 1024; //如果想在多个文件之间共享const对象,必须在对象定义时加上extern。
const int &r_ival3 = ival3; //cosnt常量引用,引用ival3对象。常量引用绑定非常量对象、字面值;非常量引用不允许绑定常量对象。
//指向常量的指针
const int *p_ival3 = &ival3; //类似于指向常量的引用。
//常量指针,即指针对象地址不能修改。
int *const pp_ival3 = &ival3; //指针将一直指向ival3.
//指向常量的常量指针
const int *const ppp_ival3 = &ival3;
//顶层const和底层const
//顶层const表示(指针)本身是个常量;底层const表示指针所指的对象是一个常量。
//const(底层) int *const(顶层) pp_ival3 = &ival3;
//常量表达式:值不会改变并且在编译过程就能得到计算结果。
const int ival6 = ival3 + 520;
//将变量声明为constexpr,便由编译器来验证变量是否是一个常量表达式。
constexpr int ival7 = 520; //如果确定变量为常量,则就把它声明为constexpr。
//算术类型、应用和指针都是字面值类型,可以被定义为constexpr;而自定义类型string则不能!
constexpr int *q = nullptr; //如果constexpr定义指针,将所定义的对象置为顶层const。
//类型别名
typedef double wages; //wages是double的同义词,p是double*的同义词。
using uwages = wages; //C++新的规定,别名声明
typedef wages *p;
//auto类型说明符,通过初始值来推算变量的类型
auto ai = 1;
//auto一般会忽略掉顶层const,如果希望推断顶层const,则需要明确指出
const auto cai = 2;
//还可以将引用的类型设为auto,此时顶层常量属性仍然保留
auto &rai = ai;
//decltype类型指示符,返回操作数的数据类型,包括顶层const和引用在内。即推断指针为引用,推断函数为函数类型!
decltype(ai) dai = 2;
//特别用法
int di = 1, *dpi = &di, &dr = di;
decltype(dr + 0) b; //返回类型为int
decltype(*dpi) dc = dr; //返回类型为int&
decltype((di)) drr = dr;//双括号的结果永远是引用
//自定义数据结构
class Sales_data
{
string bookNo;
unsigned units_sold = 0; //类内初始值,推荐使用值初始化。
double revenue = 0.0;
};
Sales_data data1, data2; //类通常被定义在头文件中,而类所在头文件的名字应与类的名字一样。
//头文件保护符,避免头文件被多次包含,从而导致重复定义
// #ifndef SALES_DATA_H
// #define SALES_DATA_H
// #include
// /*声明和定义*/
// #endif
cin.ignore();
return 0;
}
//C++定义了算术类型和空类型,其中算术类型包括字符、整数、布尔值、浮点数。
//带符号包含正数、负数、零;不带符号包含大于等于0的值。不带符号声明:unsigned int i=1。
//signed char表示-128~127,unsigned char表示0~255,不要声明char。
//当明确知晓数值不可能为负时,选用无符号类型;如果你的数值超出int范围,选用long long;在算术表达式中不要使用char和bool,只有存放字符和布尔值时才使用它;执行浮点运算选用double。
//内置类型转换:0为false,否则为true;false为0,true为1;浮点数到整数,仅保留整数部分;整数转浮点型,小数部分为0,如果整数所占空间超过浮点型容量,否则精度有可能损失;给带符号类型超范围值,结果是未定义的;
第二章介绍了C++基本的数据类型(算术型+引用+指针)及其用法,另外也讲解了C++对于复合类型的支持(类),