前言第二章第三章
整数溢出字符类型浮点数 第四章
字符串
C-style stringstring类其他形式的字符串字面值 结构体共用体枚举指针
new来分配内存指针算术 参考书籍
前言之前一直使用python,最近在学习C++,记一些笔记
第二章注意信息流传递的方向(<<或者>>)。
cout是一个ostream对象,cin是一个istream对象。可以使用下面的方法,直接打印carrots对应的数字,C++插入运算符(<<)将根据其后的数据类型相应地调整其行为,这是运算符重载的例子。cout与printf相比,其设计更加灵活,更加好用。
int carrots = 100; cout<< "Crunch, runch. Now I have "<函数编写时,可以将using namespace std放到函数定义的外面。
第三章 整数溢出函数sizeof()可以得到一个变量所占用的字节数。头文件climits中定义了符号常量来表示类型的限制
如INT_MAX=32767等。整数的溢出现象,short类型的最大值为32767
常见的整数溢出现象如图所示
# include# include int main(){ using namespace std; short carrots ; short sam = SHRT_MAX; unsigned short sue = sam; carrots = sam + 1; // 指定类型为short后就出现溢出了 sue = sue + 1; cout<< endl; cout<< sue; cout<< endl; cout<< sam + 1; // 输出仍然为正常结果 应该是数据类型的因素 // 除非有理由存储为其他类型,一般C++将整数型常量存储为int类型 cout<< "Crunch, runch. Now I have "< 输出为
32768 32768 Crunch, runch. Now I have -32768 carrots.字符类型char类型在默认情况下既不是没有符号,也不是有符号,是否有符号由C++实现决定。类型有:signed char; unsigned char; wchar_t; char16_t; char32_t
char fodo; // may be signed, may be unsigned unsigned char a; // definitely unsigned signed char b; // definitely signed如果将char用作数值类型,unsigned char表示范围为0~255,signed char表示范围为-128到127。
浮点数
wchar_t可以表示系统使用的最大扩展字符集,处理该类型的字符的输入输出可以用wcin和wcout。float数据类型一般是保留六位有效数字。
// 显示小数点后六位小数 cout.setf(ios_base::fixed, ios_base::floatfield);在进行数值转换时,“缩窄”变换(字长变短)将是无法通过编译的。
第四章 字符串C++处理字符串的方式有两种。一种是来自C语言,称为C-style string;另一种为基于string类库的方法。cin.get()和cin.getline()是适用与字符串的输入,对于整数int等的输入会报错。
[Error] invalid conversion from 'int' to 'std::basic_istreamC-style string::char_type* {aka char*}' [-fpermissive] C-style string以空字符’ ’结尾。
# includeint main(){ using namespace std; char yamcosts[3] = {'a', 'b', ' '}; char xamcosts[3] = {'a', ' ', 'c'}; cout<< yamcosts; cout<< endl; cout<< xamcosts; return 0; } 输出结果,在打印时,cout遇到’ ’便会自动停止打印。
ab a1.使用cin.getline()可以读取一行的数据,自动加上结束符’ ’,换行符不保存在输入队列中。
char a[] = "hello!"; //直接定义 cin.getline(); // 是面向行的输入,通过回车键确定结尾,不保留回车键 cin.getline(name, 15);// 将输入读到包含20个元素的name数组中,字符不超过19使用cin.get()也可读取一行的数据,但是会将换行符保留在输入队列中。
# includeint main(){ using namespace std; const int Arsize = 20; char name[Arsize]; char dessert[Arsize]; cout<<"Enter your name:n"; cin.get(name, Arsize); cout<< "Enter your favorite dessert:n"; cin.get(dessert, Arsize); cout<< "I have some delicious "<< dessert; cout<< " for you,"<< name<<".n"; return 0; } Enter your name: Tim Enter your favorite dessert: I have some delicious for you,Tim.在第二次使用cin.get()时直接没有去输入,直接打印出了后面的结果,这是因为第一个的输入的换行符仍然保存在输入队列中,第二个cin.get()识别到上一个输入的换行符,认为输入终止。
可以使用‘拼接方式’来解决这一问题cin.get(name, Arsize).get(); cin.get(dessert, Arsize).get(); // 或者 cin.getline(name, Arsize).getline(dessert, Arsize);string类ISO/ANSI C++98标准通过添加string类扩展了C++库,因此现在可以使用string类型的变量而不是字符数组存储字符串。要使用string类,必须在程序中包含头文件string。string类位于名称空间std中,必须提供一条using指令,或者使用std::string来引用。可以使用string + string的格式直接进行字符串的拼接。下面是一个例子。
# includeint main(){ using namespace std; string str1; string str2 = "panther"; int length = str2.size(); // 得到字符串的长度 length = strlen(str2); // 得到字符串的长度 cout<< "Enter a kind of feline: "; cin>> str1; cout<< "The first letter in "<< str1<< " is "; cout<< str1[0]; // 可以使用数组表示法访问存储在string对象中的字符 str1 = str1 + str1; // 可以直接字符串拼接 cout<< endl; cout<< str1; return 0; } 从键盘上得到一个字符串可以使用cin,也可以使用getline(),需要说明的是,这个getline()不是cin的类方法。
cin>> str1; // getline第一个参数表明输入的获取位置,第二个表示对应的字符串 getline(cin,str1);其他形式的字符串字面值wchar_t title[] = L"cheif"; char16_t name[] = u"Tom"; char32_t place[] = U"Xi'an";C++11还新增了原始(raw)字符串,在原始字符串中,字符表示就是自己,不需要转义符’’
cout<< R"(use "n" instead of endl.)"<< 'n';结构体C++与C的不同之处在于声明结构体变量时不需要使用关键字struct,使用string类型时,要使用std::string,不可直接使用string,或者加上using namespace std。
# include# include struct worker{ // 使用string类型时,要使用std::string,不可直接使用string,或者加上using namespace std std::string sex; int age; }; int main(){ using namespace std; worker Jack= { "man", 30}; // 初始化 cout<< Jack.age; return 0; } C++11也支持直接两个结构体赋值。
worker Tom; Tom = Jack;共用体共用体是一种数据格式,能够存储不同的数据类型,但是只能同时存储其中的一种类型,共用体只能存储int,long,double。共用体的用途之一是,当数据项使用两种或者多种格式(但是不会同时使用时),可以节省空间。常用于操作硬件数据结构。
union ThreeInOne{ int int_data; long long_data; double double_data; };枚举C++的enum工具提供了另一种创建符号常量的方式,
enum bits{one=1, two=2, four=4, eight = 8}; bits B; B = 3 ; // 报错,不可以在定义变量后直接将int类型数据赋给B // 可以直接使用枚举中的值 cout<< eight;上面例子中bits称为一个枚举,一般来说枚举中的值为整数,赋值时为float,double类型时会报错。
指针
[Error] enumerator value for 'two' is not an integer constant
默认状态下,这个整数就是所列举元素的序号,序号从0开始。 可以在定义枚举类型时为部分或全部枚举常量指定整数值,在指定值之前的枚举常量仍按默认方式取值,而指定值之后的枚举常量按依次加1的原则取值。 各枚举常量的值可以重复。下面的初始化语句在C++中是不合法的,0xB8000000,程序并不知道这其实表示的是一个地址,而会认为是一个整数。
int *pt; pt = 0xB8000000;new来分配内存基本格式为typeName *point_name = new typeName;
# include# include # include # include int main(){ using namespace std; int *pt = new int; *pt = 100; cout<< *pt; return 0; } 还可以用new来创建数组。首先介绍两个概率:静态联编,动态联编。静态联编(static binding)是指在编译时给数组分配内存。动态联编(dynamic binding)是指数组等数据是在运行时创建的。
int *pt = new int[12]; //new返回第一个数的地址,该地址被赋给指针pt delete[] pt; // 使用delete来释放new创建的数组,是数组就要有[] int *p = new double; delete p; cout << pt[0]; // 直接将new创建的得到的指针pt当作数组名使用即可 // 我们不能直接修改数组名,但是可以修改指针。下面的例子更好地体现了动态数组的特点,可以根据运行结果动态地开辟数组。
int n; cin >> n; int *pt = new int[n];同样地,也可以使用new创建动态结构体。
# include指针算术struct worker{ std::string sex; // 使用string类型时,要使用std::string int age; }; int main(){ using namespace std; worker *ps = new worker; getline(cin, ps->sex); cin>> (*ps).age; cout<< ps->age<< endl; cout<< ps->sex<< endl; return 0; } 指针变量加一,增加的量等于它指向的类型的字节数,比如将指向double的指针加1,数值将增加8。
对一个指向数组的指针使用sizeof()返回指针所占的字节数,对数组使用sizeof()得到整个数组所占的字节数。int a[10] = {0}; cout<< sizeof(a); int *pt = new int[10]; cout<< sizeof(pt);对数组名取地址时,数组名不会被解释为其地址,数组名被解释为其第一个元素的地址,而对数组名应用地址运算符,得到的是整个数组的地址。具体来讲就是a指向一个包含10个元素的int类型的数组
cout<< &a <参考书籍 C++ Primer Plus



