C++ 编程基础(一):输入/输出、数据类型与变量管理
目录
- 一、cin和cout
- 1.`using`引入整个命名空间
- 2.使用`using`限定符引入特定成员
- 3.使用std::显式引用
- 二、基本数据类型
- 1.整型
- 有符号和无符号
- 2.浮点型
- 3.字符型
- 4.布尔值
- 5.空类型(void)
- 6.使用 sizeof() 查看类型大小
- 7.转义字符
- 三、复合数据类型
- 1.引用
- 2.指针
- 3.数组
- 4.结构体
- 5.枚举
- 6.联合体
- 7.类
- 四、变量与常量
- 1.变量
- 2.常量
- const修饰符
- constexpr(常量表达式,C++11)
- 字面量常量
- 3.作用域与生命周期
- 局部变量
- 全局变量
- 五、类型别名
- 1.`typedef`:传统方式
- 2.`using`:现代 C++ 方式(推荐)
- 3.`auto` 关键字
一、cin和cout
cin
和cout
是我们最常使用的输入和输出函数。它们都定义在std
命名空间中。使用时必须引入或限定std
命名空间。
要引用一个命名空间中的内容,有三种方法:
- 使用
using
引入命名空间 - 使用
using
限定符 - 直接使用命名空间限制访问
1.using
引入整个命名空间
语法:
using namespace std;
在一开始使用using
完全引入std
命名空间,可以直接使用std
命名空间中的所有内容。
2.使用using
限定符引入特定成员
语法:
using std::cout;
using std::cin;
仅引入std
命名空间中的cout
和cin
,接下来使用cout
和cin
时,不需要带命名空间了。
3.使用std::显式引用
std::cin
std::cout
cin
和cout
可以一次性输入任意多个变量的值。还有clog
和cerr
,分别用于输出缓冲的日志信息和非缓冲的错误信息。
int a, b, c;
cin >> a >> b >> c;
cout << a << b << c;
二、基本数据类型
C++中的基本数据类型可以大致分为几类:整型、浮点型、字符型、布尔型、空类型。
1.整型
类型 | 关键字 | 占用空间 | 取值范围 | 说明 |
---|---|---|---|---|
字符型 | char | 1字节 | −27-2^7−27 ~ 272^727 或 0 到~28−12^8-128−1 | 本质是整数,常用于字符 |
短整型 | short 或short int | 2字节 | −215-2^{15}−215 ~ 215−12^{15}-1215−1 | |
整型 | int | 4 字节 | −231-2^{31}−231 ~ 231−12^{31}-1231−1 | 最常用 |
长整型 | long 或 long int | 4或8字节 | Windows 4字节,Linux/Unix 8字节 | |
超长整型 | long long 或 long long int | 8字节 | −263-2^{63}−263 ~$ 2^{63}-1$ |
有符号和无符号
整型可以分为**有符号(signed)和无符号(unsigned)**两种:
signed
:可以表示正数、负数和零(默认)unsigned
:只能表示非负数(0 及正数),范围更大
unsigned int age = 25; // 只能存非负数
signed char c = -10; // 可以存负数
以上类型除了
char
,都是带符号的,在类型名前加unsigned
得到无符号类型。字符型有三类:char
、signed char
、unsigned char
,类型char
会表现为带符号的和无符号中的一种,具体由编译器决定。
2.浮点型
浮点型用于表示带有小数的实数。
类型 | 关键字 | 占用空间 | 精度 | 说明 |
---|---|---|---|---|
单精度浮点数 | float | 4字节 | 约6 ~ 7 位有效数字 | |
双精度浮点数 | double | 8字节 | 约15 ~ 16 位有效数字 | 更常用 |
长双精度浮点数 | long double | 8或16 字节 | 更高精度 | 依赖编译器 |
float price = 19.99f; // f 后缀表示 float
double pi = 3.141592653589793;
long double bigNum = 1.234567890123456789L;
3.字符型
char
类型用于存储单个字符,如 'A'
, '1'
, '$'
等。它本质上是一个1字节的整数,使用 ASCII 编码或其他字符集。
char grade = 'A';
char digit = '5';
char symbol = '@';
注意:字符用单引号
' '
包裹,字符串用双引号" "
。
char
可以参与算术运算,因为它对应一个整数值:
char c = 'B';
cout << c << endl; // 输出: B
cout << (int)c << endl; // 输出: 66 (ASCII 值)
为了处理中文、日文等非ASCII字符,C++提供了宽字符类型wchar_t
。它的大小为2 字节(Windows)或 4 字节(Linux/Unix),支持Unicode字符集(如UTF-16或UTF-32),使用 L
前缀表示宽字符或宽字符串。
#include <iostream>
#include <cwchar>int main() {wchar_t chineseChar = L'中'; // 宽字符// 使用 wcout 输出宽字符(需配合 wcin/wcout)std::wcout << L"单个字符: " << chineseChar << std::endl;return 0;
}
4.布尔值
布尔类型 bool
用于表示逻辑值,只有两个取值:
true
(真,通常对应 1)false
(假,通常对应 0)
5.空类型(void)
void
表示“无类型”,不能用来定义变量,但可以用于:
-
函数返回类型(表示无返回值):
void printHello() {cout << "Hello, C++!" << endl; }
-
指针类型(
void*
,通用指针):void* ptr = &someVariable;
6.使用 sizeof() 查看类型大小
C++ 提供 sizeof
操作符,用于获取数据类型或变量所占的字节数:
#include <iostream>
using namespace std;int main() {cout << "int 大小: " << sizeof(int) << " 字节" << endl;cout << "double 大小: " << sizeof(double) << " 字节" << endl;cout << "char 大小: " << sizeof(char) << " 字节" << endl;return 0;
}
7.转义字符
转义字符以反斜杠 \
开头,用于表示一些无法直接输入或具有特殊功能的字符。
转义字符 | 含义 | ASCII码值(十进制) |
---|---|---|
\a | 警报 | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 代表一个反斜线字符“\” | 092 |
\' | 代表一个单引号(撇号)字符 | 039 |
\" | 代表一个双引号字符 | 034 |
\? | 代表一个问号 | 063 |
\0 | 数字0 | 000 |
\ddd | 8进制转义字符,d范围0~7 | 3位8进制 |
\xhh | 16进制转义字符,h范围0-9,a-f,A-F | 3位16进制 |
三、复合数据类型
复合类型是基于已有类型创建的新类型。这里介绍一些常见的复合数据类型。
1.引用
引用是某个已存在变量的别名。一旦绑定,引用和原变量共享同一块内存,对引用的所有操作都是在与之绑定的对象上进行的。
int n = 100;
int &ref = n; // ref是n的别名ref = 200; // 修改ref实际上修改了n
cout << n; // 输出:200
2.指针
指针是一个变量,它存储的是另一个变量的内存地址,要想获取某个变量的地址,需要使用取地址符(&)。
int val = 40;
int *ptr = &val;cout << ptr; // 输出地址
cout << *ptr; // 输出:40(解引用)
使用时建议初始化指针,避免野指针
int *p1 = nullptr; // 推荐:类型安全
int *p2 = NULL; // C 风格,本质是 0
int *p3 = 0; // 不推荐
3.数组
数组是一组相同类型的元素的集合,存储在连续的内存中。数组名本身指向的是首元素地址。
int arr[3] = {10, 20, 30};
int *p = arr; // p 指向 arr[0]cout << *(p + 1); // 输出 20,等价于 arr[1]
4.结构体
结构体是一种用户自定义的复合类型,用于将不同类型的数据组合在一起。
struct Student {std::string name;int age;double gpa;
}; // 表示一个学生// 使用结构体
Student s1;
s1.name = "Alice";
s1.age = 20;
s1.gpa = 3.8;// 初始化(C++11 花括号语法)
Student s2{"Bob", 19, 3.5};
5.枚举
枚举用于定义一组命名的整数常量,提高代码的可读性和类型安全性。
enum Color {RED, // 0GREEN, // 1BLUE // 2
};Color c = RED;
6.联合体
联合体是一种特殊的数据结构,所有成员共享同一块内存。在任意时刻,只能有一个成员有值。大小等于最大成员的大小。
union Data {int i;double d;char c;
};
7.类
类是 C++ 面向对象编程(OOP)的核心,是结构体的扩展,支持:
- 数据封装(
private
,public
,protected
) - 成员函数(方法)
- 构造函数、析构函数
- 继承、多态、运算符重载等
class Rectangle {
private:double width, height;public:Rectangle(double w, double h) : width(w), height(h) {}double area() const {return width * height;}
};Rectangle r(3.0, 4.0);
cout << r.area() << endl; // 12
struct
和class
的唯一区别是默认访问权限:
struct
默认public
class
默认private
四、变量与常量
1.变量
变量是程序中用于存储数据的命名内存单元。
变量初始化 (C++11 统一初始化)现代 C++ 强烈推荐使用花括号 {} 进行初始化,因为它能防止窄化转换等潜在的类型安全问题。
初始化方式 | 示例 |
---|---|
复制初始化 | int x = 5; |
直接初始化 | int x(5); |
花括号初始化 | int x{5}; 或 int x = {5}; |
double d = 3.14159;
int bad{d}; // 编译错误:窄化转换(double → int)
int good = d; // 会丢失精度
2.常量
常量是一旦初始化后就不能修改的值。使用常量可以提高代码的可读性和安全性。
const修饰符
使用关键字const
可以把变量定义为常量,有效防止变量的值在程序执行中不小心被改变。
const int MAX_STUDENTS = 50; // const对象必须初始化
const double PI = 3.1415926;
const char NEWLINE = '\n';
constexpr(常量表达式,C++11)
常量表达式指的是值不会改变且在编译过程就能得到计算结果的表达式。constexpr
用于声明编译期常量,其值必须在编译时就能确定。
constexpr int square(int x) {return x * x;
}constexpr int size = square(5); // 在编译时计算,结果为 25
字面量常量
直接出现在代码中的值,属于常量表达式。
int days = 365;
double pi = 3.14159;
char grade = 'A';
string name = "Alice";
365、3.14159、‘A’、"Alice"都是字面量。
3.作用域与生命周期
局部变量
- 定义在函数内部
- 生命周期:从定义到函数结束
- 存储在栈上
void func() {int localVar = 10; // 局部变量
} // localVar 在此处销毁
全局变量
- 定义在所有函数之外
- 生命周期:整个程序运行期间
- 默认初始化为 0(如果是内置类型)
int globalVar = 100; // 全局变量void func() {cout << globalVar; // 可访问
}
五、类型别名
在 C++ 编程中,有时我们会遇到非常长或复杂的类型声明,这些类型不仅难写,而且降低了代码的可读性。类型别名就是为了解决这个问题而生的。
1.typedef
:传统方式
typedef 已有类型 新类型名;
示例:
typedef unsigned long ulong;
typedef int (*FuncPtr)(int, int); // 函数指针别名ulong population = 1000000;
2.using
:现代 C++ 方式(推荐)
using 新类型名 = 已有类型;
示例:
using IntVector = std::vector<int>;
using Ptr = int*;IntVector numbers = {10, 20, 30};
3.auto
关键字
auto 关键字用于进行类型推导,让编译器根据初始化表达式自动确定变量的类型,它不是类型别名。
auto i = 10; // i 被推导为 int
auto d = 3.14; // d 被推导为 double
auto result = func(); // result 类型与 func() 返回值类型相同