1.数据的输出
cpp
std::cout << "enter two numbers:" ;
在c++中数据的输入使用cout加上<<符号,后面跟上需要输出的内容即可,该段程序的作用类似于c语言的printf。
2.数据的输入
cpp
std::cin >> a >> b;
使用cin加>>符号来进行数据的输入,表示从终端中读取两个数据a,b。
3.作用域限定符
cpp
std::cout << "a + b = " << a + b << std::endl;
其中的::就是作用域限定符,表示是属于谁的东西,也就是类似于C语言中的结构体访问变量中的.号。
4.bool类型
cpp
int main()
{
bool flag = false;
std::cout << "flag:" << flag << std::endl;
flag = true;
std::cout << "flag:" << flag << std::endl;
return 0;
}
是c++中的一个数据类型,有两个值true和false即真和假,真为1假为0。
5.引用
cpp
int main()
{
int a = 10;
int &b = a; //引用必须要初始化,b是a的别名
std::cout << "a:" << a << std::endl;
std::cout << "b:" << b << std::endl;
b = 20;
std::cout << "a:" << a << std::endl;
std::cout << "b:" << b << std::endl;
a = 30;
std::cout << "a:" << a << std::endl;
std::cout << "b:" << b << std::endl;
std::cout << "a的地址:" << &a << std::endl;
std::cout << "b的地址:" << &b << std::endl;//引用的地址和被引用的地址是一样的,指向同一块内存
return 0;
}
引用就是给变量取一个别名,两者表示的是同一块空间,引用时必须要初始化,在该段程序中b就是a的别名,两者互相改值都会对原空间中的值修改,引用的地址和被引用的地址时一样的。
6.nullptr与NULL
nullptr与NULL是完全等价的, nullptr是c++11中引入的空指针的值。
7.const 引用
cpp
const int a = 2025 ;
const int &b = a;
当给一个const修饰的常量取别名引用时,只能用const 引用。
8.decltype类型
cpp
decltype(f()) sum = X; // sum的类型就是函数f的返回类型
c++11中引入的一种类型说明符,用来从表达式的类型推断出要定义的变量的类型,不会用该表达式的值来初始化该变量。
9.字符串string
cpp
string str = "hello world";
不同于C语言对字符串的操作要通过指针和数组来完成,c++中有一个专门的字符串类型可以用来定义字符串。
10.展开命名空间的用法
cpp
using namespace std;//该行程序表示使用std命名空间,避免使用std::前缀
通过使用上述的程序就可以展开对应的命名空间,就不需要再使用std::啦,但要注意不能随意展开,特别是再工程体量比较大的时候。
11.字符串初始化两种方法
cpp
string str1 = "hello world"; //copy初始化
string str2("hello"); //直接初始化
string str3(10,'a'); //直接初始化,比copy初始化效率高
字符串初始化有复制初始化和直接初始化两种,直接初始化效率比字符初始化效率高。
12.字符串长度计算
cpp
cout << "str1的长度:" << str1.size() << endl; //用于计算字符串的长度,返回值是size_t类型,无符号整数类型
cout << "str2的长度:" << str2.size() << endl;
cout << "str3的长度:" << str3.size() << endl;
cout << "str1的长度:" << str1.length() << endl; //用于计算字符串的长度,返回值是size_t类型,无符号整数类型
cout << "str2的长度:" << str2.length() << endl;
cout << "str3的长度:" << str3.length() << endl;
字符串长度计算可以通过上述程序中的两种方法进行计算。
13.判断字符串是否为空
cpp
string str4;
cout << str4.empty() << endl; //用于判断字符串是否为空,返回值是bool类型,空返回true,非空返回false,
//可见str4没有初始化时,默认为空NULL
判断为空返回true,通过cout输出就是1。
14.数组下标操作字符串
cpp
str1 = "hello";
str1[0] = 'H'; //可以使用数组下标的形式来访问和修改字符串中的字符
for(int i = 0;i<str1.size();i++)
{
cout << str1[i] << endl;
}
可以使用数组下标的方式来修改字符串中字符的值和显示字符串中的每个字符。
15.字符串拼接
cpp
str3 = str1 + str2; //可以使用+运算符来拼接两个字符串
可以使用上述方式直接拼接字符串,对于c语言来说要拼接两个字符串要使用对应的函数。
16.字符串的关系运算
cpp
int main(int argc, char const *argv[])
{
string str1,str2;
cout << "请输入第一个字符串:";
cin >> str1;
cout << "请输入第二个字符串:";
cin >> str2;
cout << "str1 = " << str1 << endl;
cout << "str2 = " << str2 << endl;
//可以通过比较运算符来比较两个字符串的大小,比较的规则是从字符串中的第一个字符开始,
//如果第一个字符不同,就直接比较它们的大小;如果第一个字符相同,就比较第二个字符,以此类推。
//比较的是字符的ASCII码值大小
if(str1 > str2)
{
cout << str1 << '>' <<str2 << endl;
}
if(str1 >= str2)
{
cout << str1 << ">=" <<str2 << endl;
}
if(str1 < str2)
{
cout << str1 << '<' <<str2 << endl;
}
if(str1 <= str2)
{
cout << str1 << "<=" <<str2 << endl;
}
if(str1 == str2)
{
cout << str1 << '=' <<str2 << endl;
}
if(str1 != str2)
{
cout << str1 << '!' <<str2 << endl;
}
return 0;
}
可以用上述6种比较运算符来对两字符串进行关系运算。
17.for循环
cpp
int main(int argc, char const *argv[])
{
string str1 = "hello world";
for(char i:str1) //该循环语句可以遍历字符串中的每一个字符
{
cout << i << endl;
}
int a = 123;
}
c++中扩充了一种新的for循环,可以采用上述方式来循环遍历一个字符串中的每一个字符。
18.异常处理
cpp
int main(int argc, char const *argv[])
{
while (true)
{
string str1, str2;
cout << "请输入两个字符串:";
cin >> str1 >> str2;
try
{
if (str1 != str2)
{
throw runtime_error("两个字符串不相等");
}
}
catch (const runtime_error &e)
{
cerr << "异常信息:" << e.what() << endl;
cerr << "是否重新输入(y/n):";
char ch;
cin >> ch;
if (ch == 'y')
{
continue; // 结束当前循环进入下一次循环
}
else
{
break; // 结束循环
}
}
cout << "两个字符串相等" << endl;
break;
}
}
c++中提供了异常处理机制,throw表示遇到了异常将异常抛出,采用try语句块用来处理异常,cerr常用来输出异常信息,用catch来分块处理多个异常。
19.引用传参
cpp
//复制传参,交换两个变量的值
//不会改变实参的值
void swap_copy(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
//地址传参,交换两个变量的值
//会改变实参的值
void swap_addr(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
//引用传参,交换两个变量的值
//会改变实参的值
//使用引用传参避免发生copy
//且减少指针的使用
void swap_ref(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
int main(int argc, char const *argv[])
{
int x = 10;
int y = 20;
swap_copy(x,y);
cout << "1:x = " << x << " y = " << y << endl;
swap_addr(&x,&y);
cout << "2:x = " << x << " y = " << y << endl;
swap_ref(x,y);
cout << "3:x = " << x << " y = " << y << endl;
return 0;
}
c++可以使用引用传参,该方法可以避免发生copy且可以减少指针使用。
20.重载函数
cpp
//函数重载
//函数名相同,参数不同
//编译器会根据参数的类型和数量来判断调用哪个函数
//注意:函数重载不能根据返回值类型来判断调用哪个函数
//add_int_int
int add(int a, int b)
{
return a+b;
}
//add_float_float
float add(float a, float b)
{
return a+b;
}
//add_string_string
string add(string a, string b)
{
return a+b;
}
函数名一样但是参数不一样的函数可以构成重载函数,c++支持重载函数的使用c不支持,因为c是用函数名来作为唯一的函数标志的,而c++使用函数名加参数来作为函数的标志,注意返回值不作为判断函数是否重载的标志。
21.默认形参函数
cpp
//默认参数
//在定义函数时,可以为参数指定默认值
//如果调用函数时没有传递参数,就会使用默认值
//如果调用函数时传递了参数,就会使用传递的参数
//注意:默认参数必须从右往左指定
void show_default(int a =10, int b = 20, int c = 30)
{
cout << "a = " << a << " b = " << b << " c = " << c << endl;
}
int main(int argc, char const *argv[])
{
show_default();//a=10 b=20 c=30
show_default(100);//a=100 b=20 c=30
show_default(100,200);//a=100 b=200 c=30
show_default(100,200,300);//a=100 b=200 c=300
return 0;
}
在定义函数时可以为参数指定默认的值该就是默认形参函数,在调用该函数时若没有传入参数就使用该函数的默认参数,若传入了参数就使用传入的参数,而且默认的参数必须从左往右指定不能跳着指定。
22.内联函数
cpp
//内联函数
//在定义函数时,使用inline关键字可以将函数定义为内联函数
//内联函数的函数体会在调用处展开,而不是像普通函数那样跳转到函数体执行
//内联函数的调用效率高,但是会增加代码的体积
//注意:内联函数只适合函数体比较简单的函数,不要将复杂的函数定义为内联函数
inline int add(int a, int b)
{
return a+b;
}
int main(int argc, char const *argv[])
{
int x = 10;
int y = 20;
int z = add(x,y);//展开为:int z = x+y;直接展开
cout << "z = " << z << endl;
return 0;
}
内联函数的优势就是调用效率高,在调用处直接展开,比较简单的一下函数可以设置为内联函数。