| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> C++知识库 -> C++ Primer Plus 笔记(3~4章) -> 正文阅读 |
|
|
[C++知识库]C++ Primer Plus 笔记(3~4章) |
3 处理数据3.1 简单变量3.1.1 命名规则
3.1.2 整型
3.1.3 编程特性
cout << "int is" << sizeof (int) << "bytes.\n"; cout << "short is" << sizeof n_short << "bytes.\n"; //对变量名使用时括号可不加 以下为climits中的一些符号常量
int emus{7};
int rheas = {12};
int psychics{} //表示它初始化为0
int rocs = {} //同上
3.1.4 无符号类型4种整型都有对应的无符号变体,可以增大变量所能存储的最大值。如short的范围为-32768~32767,而无符号版本为0~65535 要创建无符号版本的基本整型,只需使用关键字unsigned来修改声明即可 unsigned short change; unsigned int rovert; unsigned quarterback // 默认为int类型 3.1.5 选择整型类型通常,int被设置为对目标计算机而言最为“自然”的长度。自然长度指的是计算机处理起来效率最高的长度 如果变量表示的值不能为负,则可以使用无符号类型 如果知道变量可能表示的值超过16位,则使用long,即使在32位系统上也可以这样做,这样,移植到16位系统时就不会无法工作。如果超过29亿,则使用long long 通常,仅当有大型整数数组时,有节省内存的需求时,才有必要使用short 3.1.6 整型字面值十进制:第一位为1~9 八进制:第一位为0,第二位为1~7 十六进制:前两位为0x或0X int chest = 42; int inseam = 042; int waist = 0x42;
#include <iostream>
using namespace std;
int main()
{
int chest = 42;
int waist = 42;
int inseam = 42;
?
cout << "chest = " << chest << endl; //十进制
cout << hex; //切换为16进制
cout << "waist = " << waist << endl; //16进制
cout << oct; //切换为8进制
cout << "inseam = " << inseam << endl; //8进制
return 0;
}
3.1.7 char类型:字符和小整数#include <iostream>
int main()
{
using namespace std;
char ch = 'M';
int i = ch;
cout << "The ASCII code for " << ch << " is " << i << endl;
?
cout << "Add one to the character code:" << endl;
ch++;
i = ch;
cout << "The ASCII code for " << ch << " is " << i << endl;
?
cout << "Displaying char ch using cout.put(ch): ";
cout.put(ch);
}
提供了另一种显示字符的方法,可以代替<<运算符
unsigned char 类型的表示范围通常为0~255,而signed char 的表示范围为-128~127 char 在默认情况下既不是没有符号,也不是有符号,是否有符号由C++决定,但可以显式地设置
wchar_t可以表示扩展字符集,它的类型时一种整数类型,有足够的空间,与另一种整型(底层[underlying]类型)的长度和符号属性相同 cin和cout将输入输出看作是char流,因此不适于用来处理wchar_t类型。iostream头文件中提供了功能相似的工具——wcin和wcout,可用于处理wchar_t流,另外,可以通过加上前缀L来指示宽字符常量和宽字符串 wchar_t bob = L'P'; wcout << L"tall" << endl;
bool is_ready = true; ? bool start = -100; //非零数均为true bool stop = 0; //false 3.2 const限定符使用const关键字来修改变量声明和初始化,是处理符号常量的一种方法 const int Months = 12; //Months值被固定,不可更改 注意:尽量要在声明中进行初始化 3.3 浮点数3.3.1 书写浮点数2.52e+8; 8.33E-4; 7E5; //和7E+5相同 -18.32e13 //前面可以有正负号(指数值的正负) 3.3.2 浮点数类型
#include <iostream>
int main()
{
using namespace std;
cout.setf(ios_base::fixed, ios_base::floatfield);
float tub = (10.0 / 3.0)*1e6; //6位
double mint = (10.0 / 3.0)*1e6; //15位
cout << "tub = " << tub << "\n";
cout << "mint = " << mint;
}
?
?
/*
结果:
tub = 3333333.250000
mint = 3333333.333333
*/
cout会删除结尾的0,调用cout.setf可以将这种行为覆盖,另外cout只会打印后6位 3.3.3 浮点数常量通常,浮点数常量默认为double型,但可以添加后缀进行更改 1.23f; //float 1.24F; //float 2.23L; //long double 2.24l; //long double 3.4 C++算术运算符3.4.1 运算符优先级和结合性算术运算符的优先级遵循代数优先级,如果优先级相同,则考虑操作数的结合性,乘除法都是从左向右结合的 但当操作数不同时,则规则不适用 3.4.2 除法分支当使用“ / ”时,如果两个操作数都是整数,则小数部分将被丢弃,否则不会 3.4.3 类型转换
(long) thorn; long (thorn);
char c = {66};
int x = 66;
char c = {x}; //报错,x是变量
4 复合类型4.1 数组数组声明应指出以下三点:
short months[12]; 4.1.1 数组的初始化规则
4.1.2 C++11的一些特性double earnings[4] {1,2,4,3}; //省略等号
?
unsigned int counts[10] = {}; //设置为0
float balances[100]{};
?
char plifs[] = {25,92,3.0}; //报错,列表初始化禁止缩窄转换
char slifs[4] = {'h','i',1122011,'\0'}; //同上
4.2 字符串C++处理字符串的方式有两种,一种来自C语言,被称为C风格字符串,本章先介绍它 C风格字符串具有一个特殊的性质:以空字符结尾,空字符被写作\0,其ASCII码为0,用来标记字符串结尾 用引号括起的字符串隐式地包括结尾的空字符,另外,C++对字符串长度没有限制 4.2.1 拼接字符串常量任何两个由空白(空格,制表符和换行符)分割的字符串常量豆浆自动拼接成一个 cout << "I'd give my right arm to be" "a great violinist.\n"; 4.2.2 在数组中使用字符串#include <iostream>
#include <cstring>
int main()
{
using namespace std;
const int size = 15;
char name2[size] = "C++owboy";
}
4.2.3 字符串输入cin使用空白(空格,制表符和换行符)来确定字符串的结束位置,这意味着cin在获取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符 另一个问题是,输入字符串可能比目标数组长,使用cin不能防止将包含30个字符的字符串放到29个字符的数组中的情况发生 4.2.4 每次读取一行字符串输入
它使用通过回车键输入的换行符来确定输入结尾,函数中有两个参数,数组的名称以及读取字符数,例如: cin.getline(name,20); //将姓名读入到一个包含20个元素的name数组中 函数最多读19个字符,余下空间用于存储自动在结尾处添加的空字符
与前者大致相同,但get并不再读取并丢弃换行符,而是将其留在输入队列中 解决方法:使用cin.get( )读取换行符 cin.get(name,Arsize); cin.get(); cin.get(dessert,Arsize); 也可以将两个类成员函数拼接起来,如下所示: cin.get(name,Arsize).get(); cin.get(name,Arsize)返回一个cin对象,该对象随后将被用来调用get(),同理: cin.getline(name1,Arsize).getline(name2,Arsize); //把连续输入的两行分别读入两个数组中
当get()读取空行后将设置失效位,接下来的输入将被阻断,可以用下面的命令来恢复输入: cin.clear(); 如果输入行包含的字符数比指定的多,则getline()和get()将把余下的字符留在输入队列,而getline()还会设置失效位,并关闭后面的输入 4.2.5 混合输入字符串和数字#include <iostream>
int main()
{
using namespace std;
cout << "What year was your house built?\n";
int year;
cin >> year;
cout << "What is its street address?\n";
char address[80];
cin.getline(address, 80);
cout << "Year built : " << year << endl;
cout << "Address: " << address << endl;
return 0;
}
在上述程序中,用户无法输入地址。当cin读取年份,将回车键生成的换行符留在了输入队列,后面的cin.getline看到换行符后,默认为空行,将空字符串赋值给address,解决方法是把换行符读取并吃掉 //运用get() cin >> year; cin.get(); //也可以拼接 (cin >> year).get(); 4.3 string类简介使用string对象的方式与使用字符数组相同:
string对象和字符数组的主要区别是,可以将string对象声明为简单变量,而不是数组 string str1; string str2 = "panther"; 另外,程序可以自动处理string大小 4.3.1 C++11字符串初始化char first_date[] = {"Le Chapon Dodu"};
char second_date[] {"The Elegant Plate"};
string third_date = {"The Bread Bowl"};
string fourth_date {"Hank's Fine Eats"};
4.3.2 赋值,拼接,附加string str1; string str2 = "panther"; str1 = str2; //可以直接赋值 str3 = str1 + str2; //可以用‘+’拼接 str3 += str1; //附加 4.3.3 string类的其他操作一些C风格字符串的操作: strcpy(charr1,charr2); //copy strcat(charr1,charr3); //附加在末尾 ? int len = strlen(charr4); //长度 int len2 = str4.size(); //同上 4.3.4 string类I/Ogetline(cin,str); 这里没有用句点表示法,表明这个getline()不是类方法,它将cin作为参数,指出到哪里去查找输入 另外,由于string对象自动调整大小,故不需要指出参数,也可以采用下述方法: cin >> str; 4.4 结构体简介结构体是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的数据 4.4.1 在程序中使用结构体#include <iostream>
struct inflatable
{
char name[20];
float volume;
double price;
};
int main()
{
using namespace std;
inflatable guest =
{
"mrc",
1.88,
29.99
};
inflatable pal =
{
"xzq",
3.12,
32.99
};
cout << "Expend your guest list with " << guest.name;
cout << " and " << pal.name << "!\n";
cout << "You can have both for $";
cout << guest.price + pal.price << "!\n";
return 0;
}
结构体声明可以放在main()函数内,也可以在外部声明,如果想被其他函数调用的话则必须使用外部声明 4.4.2 C++结构初始化
4.4.3 可以将string类作为成员struct inflatable
{
std::string name;
float volume;
double price;
}
4.4.4 其他结构属性
struct perks
{
int key;
}perk1,perk2;
//甚至还可以这样
struct perks
{
int key;
}perk3 =
{
7
};
struct
{
int x;
int y;
}position //创建一个名为position的结构体变量,可以访问它的成员(position.x),但不能创建同类型的变量
4.4.5 结构体数组inflatable guest[2]=
{
{"Bambi",0.5,21.99},
{"Godezilla",2000,565.99}
};
4.5 共用体共用体与结构体的不同在于,共用体只能存储一种类型,而结构体可以存储多种。二者语法相似 匿名共用体没有名称,其成员将成为位于相同地址处的变量 struct widget
{
? ?char brand[20];
? ?int type;
? ?union
? {
? long id_num;
? ? ? ?char id_char[20];
? };
};
...
widget prize;
...
if(prize.type == 1)
? ?cin >> prize.id_num;
else
? ?cin >> prize.id_char;
4.6 枚举C++的enum工具提供了另一种创建符号常量的方式,可以替代const,还允许定义新类型,语法与结构体相似 enum spectrum {red,orange,yellow,green,blue};
这条语句完成两项工作:
枚举变量只能赋予这5个值中的一个,另外,枚举没有算术运算 enum spectrum {red,orange,yellow,green,blue};
spectrum band;
band = ff; // 无效
band++; // 无效
band = orange + red; //无效,orange+red等于1,为int型,不能赋值给band(spectrum)
枚举是整型,可以被提升为int型,反之则不行 int color = blue; //有效 band = 3; //无效 color = 3 + red; //有效 如果int值是有效的,则可以强制转换 band = spectrum(3); 4.6.1 设置枚举量的值enum bits{one = 1,two = 2,four = 4,eight = 8};
enum bigstep{first,second = 100,third};
enum{zero,null = 0,one,numero_uno = 1};
4.7 指针和自由存储空间4.7.1 声明和初始化指针int updates = 4; int * p_updates; p_updates = &updates; 4.7.2 指针的危险在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据内存,为数据提供空间是一个独立的步骤 long * fellow; *fellow = 223323; fellow是一个指针,但没有将地址赋给fellow,程序不知道223323将被放在哪里,所以将它解释为存储的地址 4.7.3 指针和数字指针不是整型,虽然计算机通常把地址当作整数来处理,但从概念上看,两者是截然不同的 int * pt; pt = 0xB8000000; //pt是int值的地址并不意味着pt本身的类型是int 4.7.4 使用new来分配内存int * pn = new int; new int 告诉程序,需要适合存储int的内存,并根据类型确定需要多少字节,然后它找到这样的内存,并返回地址 接下来,将地址赋给pn,pn是被声明为指向int的指针,而*pn是存储在那里的值 4.7.5 使用delete释放内存delete作用于new出来的地址,如: int * ps = new int; int * pq = ps; delete pq; 4.7.6 使用new来创建动态数组
short * ps = new short [500]; 注意事项:
#include <iostream>
int main()
{
using namespace std;
double* p3 = new double[3];
p3[0] = 0.2;
p3[1] = 0.5;
p3[2] = 0.8;
cout << "p3[1] is " << p3[1] << ".\n";
p3++;
cout << "Now p3[0] is " << p3[0] << " and ";
cout << "p3[1] is " << p3[1] << ".\n";
p3--;
delete[] p3;
return 0;
}
4.8 指针,数组和指针算术指针和数组等价的原因在于指针算术和C++内部处理数组的方式,将指针变量加1后,增加的量等于它指向的类型的字节数 比如,将double指针加1,则数值加8(8位存储),将short加1,则数值加2 4.8.1 程序#include <iostream>
int main()
{
using namespace std;
double wages[3] = { 10.0,20.0,30.0 };
short stacks[3] = { 1,2,3 };
?
double* pw = wages;
short* ps = &stacks[0];
?
cout << "pw = " << pw << ", *pw = " << *pw << endl;
pw++;
cout << "add 1 to the pw pointer:\n";
cout << "pw = " << pw << ", *pw = " << *pw << "\n\n";
cout << "ps = " << ps << ", *ps = " << *ps << endl;
ps++;
cout << "add 1 to the ps pointer:\n";
cout << "ps = " << ps << ", *ps = " << *ps << "\n\n";
cout << "stacks[0] = " << stacks[0]
<< ", stacks[1] = " << stacks[1] << endl;
cout << "*stacks = " << *stacks
<< ", *{stacks + 1} = " << *(stacks + 1) << endl;
cout << sizeof(wages) << "= size of wages array\n";
cout << sizeof(pw) << " = size of pw pointer\n";
return 0;
}
?
?
输出结果:
pw = 00AFF7B8, *pw = 10
add 1 to the pw pointer:
pw = 00AFF7C0, *pw = 20
?
ps = 00AFF7A8, *ps = 1
add 1 to the ps pointer:
ps = 00AFF7AA, *ps = 2
?
stacks[0] = 1, stacks[1] = 2
*stacks = 1, *{stacks + 1} = 2
24 = size of wages array
4 = size of pw pointer
4.8.2 指针小结
double * pn;
double * pa; char * pc; int *pd; double bubble = 3.2; pa = &bubble; pc = new char; pd = new double[30];
cout << *pn; *pc = 'S';
int * pt = new int; *pt = 5;
int chaos[10]; //此时与&chaos[0]相同
int tacos[10] = {5,2,8,1,2,2,4,6,9,8};
int * pt = tacos;
pt++;
int * pe = &tacos[9];
pe--;
int diff = pe - pt;
int tacos[10]; //静态联编 ? int size; cin >> size; int * pz = new int[size]; //动态联编 ... delete [] pz;
int * pt = new int [10]; * pt = 5; pt[0] = 6; pt[9] = 44; int coats[10]; *(coats + 4) = 12; 4.9 数组的替代品4.9.1 模板类vectorvector类似于string类,也是一种动态数组,使用前要包含头文件 #include <vector> ... using namespace std; vector<int>vi; int n; cin >> n; vector<double>vd(n); //名为vd,存储n个double类型元素的对象 4.9.2 模板类array(C++11)array长度固定,使用栈(静态内存分配),效率与数组相同,但更方便,更安全(比vector快) #include <array>
...
using namespace std;
array<int,5>ai; // 创建一个存有5个int类型的元素的对象
array<double,4>ad = {1.2,2.1,3.43,4.3};
|
|
|
| C++知识库 最新文章 |
| 【C++】友元、嵌套类、异常、RTTI、类型转换 |
| 通讯录的思路与实现(C语言) |
| C++PrimerPlus 第七章 函数-C++的编程模块( |
| Problem C: 算法9-9~9-12:平衡二叉树的基本 |
| MSVC C++ UTF-8编程 |
| C++进阶 多态原理 |
| 简单string类c++实现 |
| 我的年度总结 |
| 【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
| c语言常见错误合集 |
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年10日历 | -2025/10/29 4:52:50- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |