文章目录
- 1、C++程序结构
- 1.1 C++程序的基本组成部分
- 1.2 预处理指令
- 1.3 注释
- 1.4 main() 主函数
- 1.5 命名空间 namespace
- 2、 C++的变量和常量
- 2.1 变量
- 2.2 变量的声明
- 2.3 变量的类型
- 3、C++ 数组和容器
- 3.1 数组(array)
- 3.2 容器(vector)
- 4、C++ 程序流程
- 4.1 if else
- 4.2 switch
- 4.3 for循环
- 4.4 while 循环
- 4.5 do-while
- 5、C++ 字符和字符串
- 5.1 C++借用C⻛格字符串
- 5.2 C++⻛格字符串
1、C++程序结构
1.1 C++程序的基本组成部分
A、关键字
B、标识符、操作符、标点
1、include,main,cin,cout,favorite_num是标识符,
2、 + - * /,<<(流插入),>>(流提取),::(作用域运算符,表示一种从属的关系)等是操作符,
3、 ;和()以及{}是标点,
4、int,return是关键字,
标识符和关键字的区别:
标识符是程序员自己定义的,主要用来标识变量,函数,类,模块等用户定义项的名称;
1.2 预处理指令
1、它指示编译器在实际编译开始之前预处理信息,
2、以#开头,不以分号 ; 结尾,
3、并不理解C++语法
1.3 注释
1.4 main() 主函数
一个C++程序必须有且只能有一个main函数,当程序运行时main函数会被操作系统所调用,
例子1:
#include<iostream>
using namespace std;
int main()
{
cout << "hello now" << endl;
return 0;
}
输出:
hello now
例子2,程序本身也是一个参数,
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
cout << "参数数量:"<<argc <<endl;
cout << "======参数列表======"<<endl;
for (int i {0};i<argc; i++)
{
cout << "参数:"<<argv[i] <<endl;
}
}
输出:
参数数量:1
======参数列表======
参数:c:\Users\22828\Desktop\CPP_project\course_2\src\2.main_type
1.5 命名空间 namespace
为了避免自己写的代码和别人写的代码的命名冲突,所以引入命名空间,
以下是命名空间的2种使用方式,
2、 C++的变量和常量
2.1 变量
用名称代替地址访问变量
1、变量是内存地址的抽象
2、变量有2个重要的属性:
Type:变量类型(integer、real number、string、Person、Student)
Value:变量值(1,3.14,”computer”)
2.2 变量的声明
也可以使用自定义的类来定义数据类型,
变量的初始化
推荐采用C++11标准初始化,如果没有进行初始化,编译器会给出一个随机的数字,比如0,
一个例子:
#include <iostream>
using namespace std;
// 这个例子可以计算房间面积
int main()
{
int room_width {0};
cout << "请输入房间的宽度:";
cin >> room_width;
int room_length {0};
cout << "请输入房间的长度:";
cin >> room_length;
cout << "房间面积是:" << room_width * room_length << "平方米" << endl;
return 0;
}
2.3 变量的类型
• 字符型(character):char
• 整型(integer):short、int、long、long long
• 浮点型(floating point):float、double
• 布尔型(Boolean):bool
不同类型的分配内存⼤⼩和取值范围和OS平台和编译器版本有关
首先介绍一下Bits(⽐特) & bytes(字节)
• 1⽐特是存储的最⼩单位
• 1⽐特只能存储0或者
• 模式数量 = 2 比特数量 2^{比特数量} 2比特数量
• 1字节 = 8⽐特
• 1字节能表达的模式数量 = 2^8 = 256个
• 可以⽤来存储 0-255 数字
• 适合存储字符(characters)/ 字⺟(letters)
A、 字符型
• 作⽤:⽤于表示单个字符,如’@’, ’a’, ’X’
• 只占⽤1个字节
• 语法:char c = ‘a’;
• 注意:
• 需要和字符串区分开,⽤单引号不是双引号
• 存储的是字符的ASCII编码,⽽不是字符本身
ASCII编码:
B、整型
作⽤:表示整数类型的数据
C、浮点型
• 作⽤:表示⼩数
• 浮点型主要有2种:float(单精度)、double(双精度)
• 注意:有效数字包含整数部分,⽐如3.14159 是6个有效数字
D、布尔型(Boolean)
• 作⽤:表示真(true)或者假(false)
• 占⼀个字节
• 0表示假,⾮0表示真
• 语法:bool add_to_cart {false};
代码:
#include <iostream>
using namespace std;
int main(){
// 字符型
cout << "====================" << endl;
char my_char {'j'}; // 注意是单引号,双引号是string类型
cout << "my char: " << my_char << endl;
// 整型
cout << "====================" << endl;
short my_score {59};
cout << "my score: " << my_score << endl;
// = 与 {} 的区别
// short 范围-32768(-2^15) to 32767(2^15-1),overflow溢出案例
short overflow_num_1 = 32768; // 不会报错,但是值会变成-32768
cout << overflow_num_1 << endl; // -32768
// short overflow_num_2 {32768}; // 编译器会做校验,会报错,所以推荐使用{}
// cout << overflow_num_2 << endl; // -32768
int my_height {178};
cout << "my height: " << my_height << endl;
long people_in_hangzhou {10360000};
cout << "people in hangzhou: " << people_in_hangzhou << endl;
long long people_on_earth {80'0000'0000}; // 为方便阅读c++ 14标准后支持'数字分割
cout << "people on earth: " << people_on_earth << endl;
// 浮点型
cout << "====================" << endl;
float book_price {32.23f}; // 加上f表示float类型,因为默认是double类型
cout << "book price: " << book_price << endl;
double pi {3.14149};
cout << "pi: " << pi << endl;
// 布尔型
cout << "====================" << endl;
bool add_to_cart {false};
// cout << boolalpha; // 以bool的形式输出
cout << "add to cart: " << add_to_cart << endl; // 0表示false
return 0;
}
E、sizeof和climits
代码:
#include <iostream>
#include <climits>
using namespace std;
int main()
{
cout << "size information" << endl;
cout << "================================================================" << endl;
cout << "char:" << sizeof(char) << " bytes." << endl;
cout << "short:" << sizeof(short) << " bytes." << endl;
cout << "int:" << sizeof(int) << " bytes." << endl;
cout << "long:" << sizeof(long) << " bytes." << endl;
cout << "long long:" << sizeof(long long) << " bytes." << endl;
cout << "================================================================" << endl;
cout << "float:" << sizeof(float) << " bytes." << endl;
cout << "double:" << sizeof(double) << " bytes." << endl;
cout << "================================================================" << endl;
cout << "min and max value defined in climits" << endl;
cout << "char min:" << CHAR_MIN << ",char max:" << CHAR_MAX << endl;
cout << "short min:" << SHRT_MIN << ",short max:" << SHRT_MAX << endl;
cout << "int min:" << INT_MIN << ",int max:" << INT_MAX << endl;
cout << "long min:" << LONG_MIN << ",long max:" << LONG_MAX << endl;
cout << "long long min:" << LLONG_MIN << ",long long max:" << LLONG_MAX << endl;
cout << "================================================================" << endl;
cout << "sizeof using variables" << endl;
int age {31};
cout << "age is " << sizeof(age) << " bytes" << endl;
double salary {22.34};
cout << "salary is " << sizeof(salary) << " bytes" << endl;
return 0;
}
输出:
size information
================================================================
char:1 bytes.
short:2 bytes.
int:4 bytes.
long:4 bytes.
long long:8 bytes.
================================================================
float:4 bytes.
double:8 bytes.
================================================================
min and max value defined in climits
char min:-128,char max:127
short min:-32768,short max:32767
int min:-2147483648,int max:2147483647
long min:-2147483648,long max:2147483647
long long min:-9223372036854775808,long long max:9223372036854775807
================================================================
sizeof using variables
age is 4 bytes
salary is 8 bytes
F、常量
作⽤:记录不可更改的数据,防⽌变量误修改
代码:
#include <iostream>
using namespace std;
int main()
{
const double pi {3.14159}; // 常量
cout << "输入半径: ";
double radius {0};
cin >> radius;
cout << "圆的面积是: " << pi * radius * radius << endl;
return 0;
}
3、C++ 数组和容器
3.1 数组(array)
• 数组所有元素都是同⼀个数据类型
• 每个元素可以单独读取
• ⻓度⼤⼩固定,且不可以再修改
• 所有元素是同⼀类型
• 元素在内存中是连续存储的
• 声明array时,内存中会分配⼀块区域来存储
• 可以使⽤存储的索引位置来获取元素(从0开始,最后⼀个元素索引为 size -1)
• 不检查是否超出区域(超出⻓度获取元素可能会报错)
A、数组的声明
elementType array_name [size];
elementType表示数组中元素的类型,array_name表示数组的名字,size表示数组的大小,
B、数组的初始化
elementType array_name [size] {初始化列表};
C、数组元素的获取及更新
代码:
#include <iostream>
using namespace std;
int main(){
char vowels[] {'a', 'e', 'i', 'o', 'u'};
cout << "元音字母第1个字母为:" << vowels[0] << endl;
cout << "元音字母第5个字母为:" << vowels[4] << endl;
// cin >> vowels[5]; // 试图访问数组的第6个元素,程序会崩溃
double hi_temps[] {90.1, 89.8, 77.5, 81.6};
cout << "第1天的最高温度为:" << hi_temps[0] << endl;
hi_temps[0] = 100.7; // 修改第1天的最高温度
cout << "第1天的最高温度为:" << hi_temps[0] << endl;
cout << "第6天的最高温度为:" << hi_temps[5] << endl; // 越界访问,可能会得到一个随机值
cout << "=====================" << endl;
// int student_scores [5]; // 5个整数的数组,但是没有初始化,数组中的值是未定义的
// cout << "第1个学生的成绩为:" << student_scores[0] << endl; // 未初始化的数组中的值是未定义的
int student_scores [5] {}; // 5个整数的数组,初始化为0
// int student_scores [5] {100}; // 5个整数的数组,初始化为100,其他元素初始化为0,并不是所有的元素都初始化为100
cout << "第1个学生的成绩为:" << student_scores[0] << endl;
cout << "第2个学生的成绩为:" << student_scores[1] << endl;
cout << "第3个学生的成绩为:" << student_scores[2] << endl;
cout << "第4个学生的成绩为:" << student_scores[3] << endl;
cout << "第5个学生的成绩为:" << student_scores[4] << endl;
cout << "重新输入5个学生的成绩:";
cin >> student_scores[0];
cin >> student_scores[1];
cin >> student_scores[2];
cin >> student_scores[3];
cin >> student_scores[4];
cout << "更新后的成绩:" << endl;
cout << "第1个学生的成绩为:" << student_scores[0] << endl;
cout << "第2个学生的成绩为:" << student_scores[1] << endl;
cout << "第3个学生的成绩为:" << student_scores[2] << endl;
cout << "第4个学生的成绩为:" << student_scores[3] << endl;
cout << "第5个学生的成绩为:" << student_scores[4] << endl;
cout << "数组名称为:" << student_scores << endl; // 数组名称为数组的首地址
cout << "=====================" << endl;
// 定义一个2维数组
int movie_ratings [3][4] {
{0, 4, 3, 5},
{2, 3, 3, 5},
{1, 4, 4, 5}
};
cout << "第1部电影的第1个评分为:" << movie_ratings[0][0] << endl;
cout << "第2部电影的第4个评分为:" << movie_ratings[1][3] << endl;
return 0;
}
3.2 容器(vector)
容器的提出:
• 假设需要存储整个学校所有学⽣的考试成绩
• ⽆法知道具体的学⽣数量
• 解决办法:
• 使⽤数组,数组⼤⼩设置的⾜够⼤
• 使⽤vector 动态数组
什么是容器(vector)?
• c++ 标准模板库STL中的容器(container)
• ⻓度⼤⼩可以随时缩放
• 和数组类似的语法⽤法
• ⾼性能
• 越界检查
• 很多有⽤的函数:sort, reverse, find等
A、容器(vector)的声明
B、容器(vector)的初始化
如下图最后一种初始化是长度为365的容器,初始值都为37.0,
C、容器的性质
• 动态调整⼤⼩
• 所有元素是同⼀类型
• 元素在内存中是连续存储的
• 可以使⽤存储的索引位置来获取元素
• 从0开始,最后⼀个元素索引为 size -1
• [ ]⽅式获取元素,提供了函数做越界检查
• 性能⾮常⾼
• 所有元素会初始化到0
D、获取容器元素
E、追加元素
F、越界检查
代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// vector<char> vowels; // 空的vector
// vector<char> vowels(5); // 5个元素的vector,初始化为0
vector <char> vowels {'a', 'e', 'i', 'o', 'u'}; // 5个元素的vector,初始化为元音字母
cout << vowels[0] << endl; // 访问第1个元素
cout << vowels[4] << endl; // 访问第5个元素
// vector <int> student_scores (3); // 3个整数的vector,初始化为0,使用的是默认构造函数
// cout << student_scores[0] << endl; // 访问第1个元素
// vector <int> student_scores (3,100); // 3个整数的vector,初始化为100,使用的是带参数的构造函数
// cout << student_scores[0] << endl; // 访问第1个元素
vector <int> student_scores {100, 99, 98}; // 3个整数的vector,初始化为100,99,98,使用的花括号初始化
cout << "array风格访问:" << endl;
cout << "三个学生的成绩为:" << student_scores[0] << " " << student_scores[1] << " " << student_scores[2] << endl;
cout << "====================" << endl;
cout << "vector风格访问:" << endl;
cout << "三个学生的成绩为:" << student_scores.at(0) << " " << student_scores.at(1) << " " << student_scores.at(2) << endl;
cout << "vector大小为:" << student_scores.size() << endl;
cout << "====================" << endl;
cout << "修改vector中的元素:";
cin >> student_scores.at(0);
cin >> student_scores.at(1);
cin >> student_scores.at(2);
cout << "修改后的三个学生的成绩为:" << student_scores.at(0) << " " << student_scores.at(1) << " " << student_scores.at(2) << endl;
cout << "====================" << endl;
int new_add_score {0};
cout << "添加新的成绩:";
cin >> new_add_score;
student_scores.push_back(new_add_score);
cout << "再添加一个新的成绩:";
cin >> new_add_score;
student_scores.push_back(new_add_score);
cout << "添加后一共有" << student_scores.size() << "个成绩,分别为:" << endl;
cout << "第1个成绩为:" << student_scores.at(0) << endl;
cout << "第2个成绩为:" << student_scores.at(1) << endl;
cout << "第3个成绩为:" << student_scores.at(2) << endl;
cout << "第4个成绩为:" << student_scores.at(3) << endl;
cout << "第5个成绩为:" << student_scores.at(4) << endl;
// cout << "故意访问不存在的元素:" << endl;
// cout << "第6个成绩为:" << student_scores.at(5) << endl; // 故意访问不存在的元素,会报错
cout << "====================" << endl;
// 定义二维vector
vector <vector<int>> vector_2d
{
{1,2,3},
{4,5,6},
{7,8,9}
};
cout << "array风格打印二维vector第一行:" << endl;
cout << vector_2d[0][0] << " " << vector_2d[0][1] << " " << vector_2d[0][2] << endl;
cout << "vector风格打印二维vector第二行:" << endl;
cout << vector_2d.at(1).at(0) << " " << vector_2d.at(1).at(1) << " " << vector_2d.at(1).at(2) << endl;
}
4、C++ 程序流程
关于C++程序流程,可参考我写的另外一个博客:CSDN全息数据博客
• 顺序执⾏(Sequence)
• 指令按先后顺序执⾏
• 条件分⽀(Selection)
• 做决定
• 循环(Iteration)
• 重复执⾏某任务
4.1 if else
语法格式:
if(条件)
{条件满足执行的语句}
else
{条件不满足执行的语句}
代码1:
#include <iostream>
using namespace std;
int main(){
int input_num {0};
const int lower_limit {10};
const int upper_limit {100};
cout << "请输入一个介于" << lower_limit << "和" << upper_limit << "之间的整数:";
cin >> input_num;
if(input_num >= lower_limit){
cout << "===========条件1============" << endl;
cout << input_num << "大于等于" << lower_limit << endl;
cout << input_num << "比" << lower_limit << "大" << (input_num - lower_limit) << endl;
}
if(input_num <= upper_limit){
cout << "===========条件2============" << endl;
cout << input_num << "小于等于" << upper_limit << endl;
cout << input_num << "比" << upper_limit << "小" << (upper_limit - input_num) << endl;
}
if(input_num >= lower_limit && input_num <= upper_limit){
cout << "===========条件3============" << endl;
cout << input_num << "介于" << lower_limit << "和" << upper_limit << "之间" << endl;
cout << "条件1、2都成立" << endl;
}
if(input_num == lower_limit || input_num == upper_limit){
cout << "===========条件4============" << endl;
cout << input_num << "在边界点上" << endl;
cout << "条件1、2、3都成立" << endl;
}
return 0;
}
代码2:
#include <iostream>
using namespace std;
int main()
{
int input_num {0};
const int target_num {50};
cout << "请输入一个整数,我将与" << target_num << "比较:";
cin >> input_num;
if (input_num <= target_num){
cout << "================条件1================" << endl;
cout << input_num << "小于等于" << target_num << endl;
cout << input_num << "比" << target_num << "小" << (target_num - input_num) << endl;
}else{
cout << "================条件2================" << endl;
cout << input_num << "大于" << target_num << endl;
cout << input_num << "比" << target_num << "大" << (input_num - target_num) << endl;
}
return 0;
}
4.2 switch
作用:执行多条件分支语句
switch和if语句的区别:
1、switch判断的条件只能是整型或字符型,不能是一个区间;
2、结构清晰,执行效率高;
注意:
case里面如果没有break,程序会一直向下执行;
代码1:
#include <iostream>
using namespace std;
int main()
{
char letter_grade {};
cout << "请输入你的成绩:";
cin >> letter_grade;
switch (letter_grade){
case 'a':
case 'A':
cout << "优秀" << endl;
break;
case 'b':
case 'B':
cout << "良好" << endl;
break;
case 'c':
case 'C':
cout << "中等" << endl;
break;
case 'd':
case 'D':
cout << "及格" << endl;
break;
default:
cout << "输入错误" << endl;
}
return 0;
}
代码2:
#include <iostream>
using namespace std;
int main()
{
enum Traffic_light {red, yellow, green}; // 枚举类型
Traffic_light light_color {yellow};
switch (light_color){
case red:
cout << "红灯" << endl;
break;
case yellow:
cout << "黄灯" << endl;
break;
default: // 必须加上default,否则编译器会警告
cout << "ok" << endl;
}
}
4.3 for循环
作用:满足循环条件,执行循环语句
语法:for(起始表达式;条件表达式;末尾循环体){循环语句;}
for循环的基本形式:
在起始表达式完成变量的声明和初始化;
遍历数组:
逗号的分割使用:
无参数,无限循环,
代码1:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// 简单的for demo
// for(int i {1}; i <= 10; ++i)
// cout << i << endl;
// 每次i增加2
// for (int i {1}; i <= 10; i += 2)
// cout << i << endl;
// 从10递减到1
// for (int i {10}; i >= 1; --i)
// cout << i << endl;
// 循环中添加if语句
// for (int i {1}; i <= 10; ++i){
// if (i % 2 == 0)
// cout << i << "是偶数" << endl;
// else
// cout << i << "是奇数" << endl;
// }
// 2个参数
for (int i {1}, j {5}; i <= 5; ++i, ++j)
cout << i << " * "<< j << " = " << (i * j) << endl;
// 遍历vector
vector <int> nums {1,2,3,4,5,6,7,8,9,10}; // 初始化vector
for (unsigned i {0}; i < nums.size(); ++i) // 要使用unsigned,否则会报警,因为size()是long unsigned int,所以要统一好数据类型
cout << nums[i] << endl;
return 0;
}
基于范围的循环:
for—— auto类型: 代码注释的“耗时”是自己确认数据类型的时间
for—— 解析vector:
for—— 解析序列:
for—— 解析字符串:
代码2:
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
int main()
{
// int student_scores [] {100, 98, 90, 86, 84}; // 初始化数组
// for (auto score: student_scores)
// cout << score << endl;
// // 计算平均温度
// vector <double> temps {23.1,22.9,19.3,23.2}; // 初始化vector
// double temp_average {};
// double temp_total {};
// for (auto temp: temps)
// temp_total += temp;
// if (temps.size() != 0)
// temp_average = temp_total / temps.size();
// // 设置精度
// cout << fixed << setprecision(1);
// cout << "平均温度:" << temp_average << endl;
// // 初始化的列表
// for (auto i: {1,2,3,4,5,6,7,8,9,10})
// cout << i << endl;
// return 0;
// 遍历string 字符串
for (auto c: "This is a test")
cout << c;
cout << endl;
}
4.4 while 循环
作用:满足循环条件,执行循环语句
语法:while(循环条件){循环语句}
解释:只要循环的条件为真就会执行循环语句
while——打印偶数:
while——遍历数组:
while——输⼊验证:
4.5 do-while
作用:满足循环条件,执行循环语句
语法:do{循环语句}while(循环条件)
与while的区别:
do…while会先执行循环语句,再判断循环条件,与while正好相反
代码:
#include <iostream>
using namespace std;
int main()
{
// 输入菜单
char input_char {};
do {
cout << "\n 菜单:" << endl;
cout << "1. 打印Hello World" << endl;
cout << "2. 打印Hello C++" << endl;
cout << "3. 打印Hello C" << endl;
cout << "q或Q. 退出" << endl;
cout << "请输入菜单选项:";
cin >> input_char;
cout << endl;
switch (input_char)
{
case '1':
cout << "Hello World" << endl;
break;
case '2':
cout << "Hello C++" << endl;
break;
case '3':
cout << "Hello C" << endl;
break;
case 'q':
case 'Q':
cout << "退出" << endl;
break;
default:
cout << "输入错误" << endl;
break;
}
} while (input_char != 'q' && input_char != 'Q');
return 0;
}
5、C++ 字符和字符串
5.1 C++借用C⻛格字符串
C++存储C风格字符串时,字符串使用的是双引号,每个字符串会多存储1个字符大小 \0 作结束符号;
cstring函数:
代码:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
// 全部初始化为空
char first_name [20] {};
char last_name [20] {};
char full_name [50] {};
char temp [50] {};
// // 用户输入
// cout << "请输入您的姓:";
// cin >> first_name;
// cout << "请输入您的名:";
// cin >> last_name;
// cout << "----------------------------------------" << endl;
// cout << "您的姓:" << first_name << ",一共有 " << strlen(first_name) << " 个字符" << endl;
// cout << "您的名:" << last_name << ",一共有 " << strlen(last_name) << " 个字符" << endl;
// // 拼接名字
// strcpy(full_name, first_name); // 拷贝 first_name 到 full_name
// strcat(full_name, " "); // 拼接空格
// strcat(full_name, last_name); // 拼接 last_name
// cout << "您的全名是:" << full_name << endl;
// cout << "----------------------------------------" << endl;
// cout << "请输入您的全名:";
// cin >> full_name; // 有空格的话,只会读取到空格前的内容
// cout << "您的全名是:" << full_name << endl;
cout << "----------------------------------------" << endl;
cout << "请输入您的全名:";
cin.getline(full_name, 50); // 读取一行,包括空格
cout << "您的全名是:" << full_name << endl;
cout << "----------------------------------------" << endl;
// 比较字符串
strcpy(temp, full_name); // 拷贝 full_name 到 temp
if (strcmp(temp, full_name) == 0) // 比较 temp 和 full_name
cout << temp << " 和 " << full_name << " 是相同的" << endl;
else
cout << temp << " 和 " << full_name << " 是不同的" << endl;
cout << "----------------------------------------" << endl;
// 将字符串转换为大写
for(size_t i {0}; i < strlen(full_name); i++){
if (isalpha(full_name[i])){ // 判断是否是字母
full_name[i] = toupper(full_name[i]); // 转换为大写
}else{
full_name[i] = '*';
}
}
cout << full_name << endl;
return 0;
}
5.2 C++⻛格字符串
• Std::string 是STL中⼀个类
• 使⽤前必须要导⼊#include
• std namespace
• 内存中连续,动态⼤⼩
• 可转c-style字符串相互转化
• 提供越界检查,更安全
A、声明和初始化
B、赋值
C、加粗样式
D、获取字符,更新
E、遍历
代码:
#include <string>
#include <iostream>
using namespace std;
int main()
{
// 声明和初始化
// string s1; // 全部初始化为空
// string s2 {"hello"}; // 初始化为 hello
// string s3 {s2}; // 拷贝 s2
// string s4 {s3, 0, 4}; // 拷贝 s3 的前 4 个字符
// string s5 {"hello", 3}; // 拷贝 hello 的前 3 个字符
// string s6 (5, 'x'); // 5 个 x
// // 打印s1、s2、s3、s4、s5、s6
// cout << "s1 is empty: " << s1 << endl;
// cout << "s2 is: " << s2 << endl;
// cout << "s3 is: " << s3 << endl;
// cout << "s4 is: " << s4 << endl;
// cout << "s5 is: " << s5 << endl;
// cout << "s6 is: " << s6 << endl;
// // 赋值
// string s1;
// s1 = "C++ hello world";
// cout << "s1 is: " << s1 << endl;
// string s2 {"course"};
// cout << "s2 is: " << s2 << endl;
// s2 = s1;
// cout << "s2 is: " << s2 << endl;
// // 拼接
// string part1 {"C++"};
// string part2 {"是一门强大的"};
// string sentence;
// sentence = part1 + " " + part2 + "语言";
// cout << sentence << endl;
// // sentence = "C++" + "是一门强大的语言"; // 错误,不能将2个c-style字符串字面量相加
// // 获取字符,更新
// string s1 {"Hello"};
// // 获取元素
// cout << s1[1] << endl; // e
// cout << s1.at(2) << endl; // l
// // 重新赋值
// s1[1] = 'a'; // Hallo
// s1.at(2) = 'X'; // HaXlo
// cout << s1 << endl;
// // 遍历
// string s1 {"Hello"};
// for(auto c: s1){ // 可以使用char或auto
// cout << c << endl;
// }
// for(int c: s1){ // 打印出来的是ASCII码
// cout << c << endl;
// }
return 0;
}