C++学习之路
在上一篇文章中,我们成功配置了环境,运行起了我们的第一个C++程序,也成功地解决了中文乱码的问题,那现在,就让我们一起来学习C++的一些基本操作吧。
一、输入输出(I/O)
C++ 的 I/O 发生在流中,流是字节序列。
如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存,这叫做输入操作。
如果字节流是从内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等),这叫做输出操作。
I/O 库头文件:
头文件 | 函数和描述 |
---|---|
<iostream> | 该文件定义了 cin、cout、 cerr 和 clog 对象,分别对应于标准输入流、标准输出流、 缓冲标准错误流和缓冲标准错误流。 |
<iomanip> | 该文件通过所谓的参数化的流操纵器(比如 setw 和 setprecision),来声明对执行标准化 I/O 有用的服务。 |
<fstream> | 该文件为用户控制的文件处理声明服务。 |
1、标准输出流(cout)
预定义的对象 cout 是 iostream 类的一个实例。 cout 对象"连接"到标准输出设备,通常是显示屏。cout 是与流插入运算符 << 结合使用的, 如下所示:
#include <iostream>//头文件
using namespace std;
int main( ){
char str[] = "Hello C++";
cout << "Value of str is : " << str << endl;
system("pause");
}
执行结果:
Value of str is : Hello C++
其实我们在上一篇的第一个程序中就已经使用过它了,不过这里我们可以从这个例子中学到: 流插入运算符 << 在一个语句中可以多次使用;endl用于在行末添加一个换行符。
2、标准输入流(cin)
预定义的对象 cin 是 iostream 类的一个实例。 cin 对象附属到标准输入设备,通常是键盘。cin 是与流提取运算符 >> 结合使用的, 如下所示:
#include <iostream>
using namespace std;
int main(){
char name[50];
cout << "请输入您的姓名: ";
cin >> name;
cout << "Hello," << name << "!" << endl;
system("pause");
return 0;
}
执行结果:
程序执行时,程序会请求我们输入姓名,当我们输入名字并按下回车时,C++ 编译器就会根据要输入值的数据类型,选择合适的流提取运算符来提取值,并把它存储在给定的变量中(此例中为name),然后通过标准输出流(cout)将其显示出来。
与流插入运算符 << 一样,流提取运算符 >> 也可以在一个语句中多次使用。
二、数据类型
1.基本的内置类型
类型 | 关键字 |
---|---|
布尔型 | bool |
字符型 | char |
整型 | int |
浮点型 | float |
双浮点型 | double |
无类型 | void |
宽字符型 | wchar_t |
各种变量类型在内存中存储值时需要占用的内存是不一样的,具体信息可前往: 菜鸟教程 |C++数据类型
一些基本类型可以使用一个或多个类型修饰符进行修饰:
修饰符 | 描述 |
---|---|
signed | 表示变量可以存储负数。对于整型变量来说,signed 可以省略,因为整型变量默认为有符号类型。 |
unsigned | 表示变量不能存储负数。对于整型变量来说,unsigned 可以将变量范围扩大一倍。 |
short | 表示变量的范围比 int 更小。short int 可以缩写为 short。 |
long | 表示变量的范围比 int 更大。long int 可以缩写为 long。 |
long long | 表示变量的范围比 long 更大。C++11 中新增的数据类型修饰符。 |
默认情况下,int、short、long都是带符号的,即 signed。
2.常量
常量就像是常规的变量,只不过常量的值在定义后不能进行修改。 这些固定的值,又叫做字面量。 常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。
常量的定义方式:
- 使用 #define 预处理器。
- 使用 const 关键字。
请注意,把常量定义为大写字母形式,是一个很好的编程风格。
3.类型转换
C++ 中有四种类型转换:静态转换、动态转换、常量转换和重新解释转换。这里我们主要先看一下静态转换(Static Cast):
- 静态转换是将一种数据类型的值强制转换为另一种数据类型的值。
- 静态转换通常用于比较类型相似的对象之间的转换,例如将 int 类型转换为 float 类型。
- 静态转换不进行任何运行时类型检查,因此可能会导致运行时错误。
//实例:
int i = 10;
float f = static_cast<float>(i); // 静态将int类型转换为float类型
三、数组和字符串
1.数组
数组的声明:
在 C++ 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:
type arrayName [ arraySize ];
这是一个一维数组,arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C++ 数据类型。
除了数组定义时与Java有些许的差别,其他有关数组的操作(初始化,数组的访问…)大致上还是一样的,就不过多赘述了。
2.字符串
C++ 提供了以下两种类型的字符串表示形式:
- C 风格字符串
- C++ 引入的 string 类类型.
(1)C 风格字符串
C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。
字符串的声明:
char arr[] = "Hello";
我们来看一下这个字符串的总长度:
#include <iostream>
using namespace std;
int main(){
char arr[] = "Hello";
int len = sizeof(arr);
cout << len << endl;
system("pause");
}
执行结果:
6
这是因为C++ 编译器会在初始化数组时,自动把 \0 放在字符串的末尾。 由于在数组的末尾存储了空字符,所以字符数组的大小比单词 Hello 的字符数多一个。其实上面的声明就相当于:
char arr[] = {'H','e','l','l','o','\0'};
想排除\0对于字符串长度的影响,我们可以使用C++中自带的strlen函数:(需要引入头文件<string.h>)
#include <iostream>
#include <string.h> // 函数strlen所属的头文件
using namespace std;
int main(){
char arr[] = {'H','e','l','l','o','\0'};
cout << strlen(arr) << endl;
system("pause");
}
执行结果:
5
C++ 中还提供了大量的函数用来操作以 null 结尾的字符串:
函数 | 目的 |
---|---|
strcpy(s1, s2); | 复制字符串 s2 到字符串 s1 |
strcat(s1, s2); | 连接字符串 s2 到字符串 s1 的末尾(也可以用 + 号连接两个字符串) |
strlen(s1); | 返回字符串 s1 的长度 |
strcmp(s1, s2); | 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0 |
strchr(s1, ch); | 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置 |
strstr(s1, s2); | 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置 |
(2)C++ 中的 String 类
C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。 类是 C++ 的核心特性,通常被称为用户定义的类型。
类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。
总的来说,String类的出现比C标准库中提供的str系列的库函数更能契合C++面向对象的这一思想。
因为之前用Java比较多,就不细追类和对象,大家可以自行了解学习。
String类的使用:
#include <iostream>
#include <string> //sting类的头文件
using namespace std;
int main(){
string str = "gaga";
cout << str.length() << endl;
cout << str << endl;
system("pause");
}
执行结果:
4
gaga
四、其他
除了上述的一些内容,C++中还有循环(或许后续会出一篇讲解排序方法的文章),判断,指针(这个比较重要,下一篇讲),运算符,函数等许多基础内容,因与Java中差别不大,就不进行详细的讲述了。
以上内容谨为个人学习过程的记录,欢迎大家一起学习和指正