C++ Programming Language —— 第1章:核心语法
目录
一、第一个C++程序
1.框架
2.代码
二、注释
1.作用
2.两种格式
3.提示
三、变量
1.变量的定义
2.变量的作用
3.变量的语法结构
① 基本声明语法
② 初始化方式
4.变量声明与定义
5.变量类型
6.变量作用域
7.变量存储类别
8.常量与只读变量
9.变量初始化
10.类型推导(C++11 起)
11.变量的内存对齐(C++11 起)
12.右值引用与移动语义(C++11 起)
13.原子变量(C++11 起)
14.结构化绑定(C++17 起)
15.概念与约束(C++20 起)
16.变量模板(C++14 起)
17.线程局部存储(C++11 起)
四、常量
1. 常量的定义
2. 常量的作用
3. 常量的语法结构
(1)使用const关键字
(2)使用constexpr(C++11 及以后)
(3)define 宏常量
(4)常量指针与指针常量
常量指针(指向常量的指针)
指针常量(指针本身是常量)
指向常量的常量指针
(5)常量引用
(6)类中的常量
常量成员变量
常量成员函数
常量对象
4. 与宏定义的对比
5. 注意事项
五、关键字
①作用
②基本使用的关键字
③常用关键字
1.int
2.float / double
3.char
4.bool
④控制流关键字
1.if-else
2.switch
3.for
4.while / do-while
⑤函数与类关键字
1.void
2.return
3.class
4.public / private / protected
⑥内存管理关键字
1.new / delete
2.static
⑦其他关键字
1.const
2.friend
3.this
六、标识符命名规则
一、第一个C++程序
1.框架
#include<iostream>
using namespace std;
int main() {system("pause");return 0;
}
2.代码
#include<iostream>
using namespace std;
/*这行代码声明使用标准命名空间(std)。命名空间是 C++ 中避免命名冲突的机制,标准库中的所有标识符都定义在 std 命名空间中。通过这行代码,我们可以直接使用cout和endl,而不必写成std::cout和std::endl。*/
int main() {
/*这行代码定义了程序的入口点 ——main函数。int表示该函数返回一个整数值(通常用于表示程序的退出状态)。括号()表示该函数不接受任何参数。大括号{标志着函数体的开始。*/cout << "Hello world" << endl;
/*这行代码是程序的核心功能。cout是标准输出流对象,<<是流插入运算符,用于向输出流中插入数据。这行代码将字符串字面量"Hello world"输出到控制台。endl是一个操纵符,用于插入换行符并刷新输出缓冲区。*/system("pause");
/*这行代码调用系统命令pause(在 Windows 系统中),作用是暂停程序执行,等待用户按下任意键继续。这通常用于调试环境,防止控制台窗口在程序执行完毕后立即关闭,以便用户能看到输出结果。*/return 0;
}
main是程序入口,只能有一个!!!
二、注释
1.作用
在代码中加一些说明和解释,方便自己或其他程序员程序员阅读代码。
2.两种格式
① 单行注释:// 描述信息——通常放在一行代码的上方,或者一条语句的末尾,==对该行代码说明==
②多行注释: /* 描述信息 */——通常放在一段代码的上方,==对该段代码做整体说明==
3.提示
编译器在编译代码时,会忽略注释的内容。
三、变量
1.变量的定义
定义:变量是程序中用于存储数据的内存单元,每个变量具有特定的类型、名称和作用域,通过名称可以访问和操作其存储的值。
2.变量的作用
-
数据存储与传递:
- 存储程序运行时需要处理的输入数据、中间结果或最终结果(如计算过程中的数值、用户输入的字符串等)。
- 在函数、模块之间传递数据(如通过参数传递变量值)。
-
控制程序逻辑:
- 作为条件判断的依据(如
if (count > 10)
中的count
变量)。 - 用于循环计数(如
for (int i = 0; i < n; i++)
中的i
)。
- 作为条件判断的依据(如
-
抽象与复用:
- 通过命名变量简化复杂数据的表示(如用
pi
表示圆周率,提升代码可读性)。 - 允许同一变量在不同场景中重复使用(如循环中反复更新计数器)。
- 通过命名变量简化复杂数据的表示(如用
3.变量的语法结构
① 基本声明语法
[存储类别] [类型说明符] [变量名] [初始化表达式];
- 存储类别(可选):
auto
、static
、extern
、register
、thread_local
等(如static int count;
)。 - 类型说明符(必须):基本类型(
int
、double
、char
等)或复合类型(数组、指针、引用等)。 - 变量名(必须):符合标识符规则(字母、数字、下划线,不能以数字开头,不与关键字冲突)。
- 初始化表达式(可选):如
= 值
或{值}
(如int x = 10;
或double y{3.14};
)。
② 初始化方式
4.变量声明与定义
变量声明告知编译器变量的类型和名称,而定义则会为变量分配内存空间。
int a; // 声明并定义变量 a
extern int b; // 仅声明变量 b,告诉编译器 b 在其他地方定义
例如:
#include<iostream>
using namespace std;
int main() {//变量的定义//语法:数据类型 变量名 = 初始值int a = 10;cout << "a = " << a << endl;//a = 10system("pause");return 0;
}
5.变量类型
C++ 提供了多种基本数据类型,也支持用户自定义类型。
// 基本数据类型
int num = 42; // 整数
double pi = 3.14; // 双精度浮点数
char letter = 'A'; // 字符
bool isTrue = true; // 布尔值
std::string name = "Doubao"; // 字符串(需包含 <string> 头文件)// 复合类型
int arr[5] = {1, 2, 3, 4, 5}; // 数组
int* ptr = # // 指针
int& ref = num; // 引用
6.变量作用域
变量的作用域决定了它的可见性和生命周期。
void func() {int x = 10; // 局部变量,仅在函数内部可见if (true) {int y = 20; // 块作用域变量,仅在 if 语句块内可见}
} // x 和 y 的生命周期在此结束int global = 100; // 全局变量,整个程序都可见
7.变量存储类别
变量的存储类别决定了其内存分配方式和生命周期。
// 自动变量(默认)
{int autoVar = 5; // 等价于 auto int autoVar = 5;
} // 离开作用域时自动销毁// 静态变量
void staticDemo() {static int count = 0; // 静态局部变量,函数调用间保持值count++;
}// 外部变量(使用 extern)
extern int externalVar; // 声明外部定义的变量// 寄存器变量
register int regVar = 10; // 建议编译器将变量存储在寄存器中
8.常量与只读变量
使用 const
和 constexpr
定义不可修改的变量。
const double gravity = 9.8; // 常量,定义后不可修改
constexpr int maxValue = 100; // 编译时常量,必须在编译时确定值int num = 5;
const int& constRef = num; // 对常量的引用,不能通过引用修改 num
9.变量初始化
C++ 提供多种初始化方式。
int a = 10; // 拷贝初始化
int b(20); // 直接初始化
int c{30}; // 列表初始化(C++11),防止缩窄转换
int d = {40}; // 拷贝列表初始化// 动态初始化
int e = func(); // 使用函数返回值初始化
10.类型推导(C++11 起)
使用 auto
和 decltype
自动推导变量类型。
auto x = 10; // x 为 int 类型
auto y = 3.14; // y 为 double 类型
decltype(x) z = 20; // z 为 int 类型,与 x 类型相同
11.变量的内存对齐(C++11 起)
使用 alignas
控制变量的对齐方式。
alignas(16) char buffer[64]; // 缓冲区按 16 字节对齐
12.右值引用与移动语义(C++11 起)
使用右值引用 &&
绑定临时对象,实现移动语义。
int&& rref = 10 + 20; // 右值引用绑定到临时表达式
13.原子变量(C++11 起)
使用 std::atomic
定义原子操作的变量,用于多线程编程。
#include <atomic>
std::atomic<int> counter(0); // 原子计数器,多线程安全
14.结构化绑定(C++17 起)
从聚合类型中解包变量。
std::pair<int, double> p = {1, 2.3};
auto [a, b] = p; // a 为 int 类型,b 为 double 类型
15.概念与约束(C++20 起)
使用概念约束变量类型。
#include <concepts>
template <std::integral T>
T add(T a, T b) {return a + b;
}
16.变量模板(C++14 起)
定义模板化的变量。
template <typename T>
constexpr T pi = T(3.1415926535897932385);
17.线程局部存储(C++11 起)
使用 thread_local
定义线程局部变量。
thread_local int threadID = 0; // 每个线程拥有自己的副本
四、常量
1. 常量的定义
是程序运行期间其值不可被修改的量。在 C++ 中,常量一旦被初始化,就不能再被赋值。通过使用常量,可以提高代码的安全性和可维护性。
2. 常量的作用
- 防止意外修改:确保变量值在初始化后不会被改变。
- 提高代码可读性:用有意义的名称代替字面量(如
PI
代替3.14159
)。 - 便于维护:修改常量定义时,所有引用处会自动更新。
- 编译期优化:
constexpr
常量在编译时求值,提升运行效率。
3. 常量的语法结构
(1)使用const
关键字
const 数据类型 常量名 = 初始值;
示例:
const int MAX_SIZE = 100;
const double PI = 3.14;
(2)使用constexpr
(C++11 及以后)
constexpr 数据类型 常量名 = 常量表达式;
示例:
constexpr int SQUARE(int x) { return x * x; }
constexpr int RESULT = SQUARE(5); // 编译时计算为25
(3)define 宏常量
#define 常量名 常量值
通常在文件上方定义,表示一个常量.示例:
#define day 7
int main() {cout << "一周里总共有 " << day << " 天" << endl;//day = 8; //报错,宏常量不可以修改//2、const修饰变量const int month = 12;cout << "一年里总共有 " << month << " 个月份" << endl;//month = 24; //报错,常量是不可以修改的system("pause");return 0;
}
(4)常量指针与指针常量
-
常量指针(指向常量的指针)
const 数据类型* 指针名; // 或 数据类型 const* 指针名;
const int* p;
int a = 10;
p = &a; // 合法
// *p = 20; // 非法:不能通过指针修改值
-
指针常量(指针本身是常量)
数据类型* const 指针名 = &初始值;
int a = 10, b = 20;
int* const p = &a;
*p = 20; // 合法:可以修改指向的值
// p = &b; // 非法:不能修改指针本身
-
指向常量的常量指针
const 数据类型* const 指针名 = &初始值;
const int* const p = &a;
// *p = 20; // 非法:不能修改指向的值
// p = &b; // 非法:不能修改指针本身
(5)常量引用
const 数据类型& 引用名 = 被引用对象;
const int& ref = a;
// ref = 20; // 非法:不能通过引用修改值
(6)类中的常量
-
常量成员变量
在构造函数初始化列表中初始化。
class MyClass {
public:const int value;MyClass(int val) : value(val) {} // 必须在初始化列表中赋值
};
-
常量成员函数
返回类型 函数名(参数列表) const;
示例:
class MyClass {
public:int getData() const { return data; } // 常量成员函数
private:int data;
};
-
常量对象
const 类名 对象名(参数);
const MyClass obj(10);
obj.getData(); // 只能调用常量成员函数
4. 与宏定义的对比
5. 注意事项
const
变量必须初始化:定义时必须赋值,否则会编译错误。constexpr
要求:用于编译期常量,函数体必须足够简单(如纯计算)。- 类中的静态常量:静态常量成员需在类外初始化(除非使用
inline
或constexpr
)。
五、关键字
①作用
关键字是C++中预先保留的单词(标识符)
②基本使用的关键字
③常用关键字
1.int
- 定义:用于声明整数类型的变量。
- 作用:存储整数值,范围与具体实现相关。
- 语法表达:
int 变量名;
- 示例:
int age = 25;
int sum = 10 + 20;
2.float / double
- 定义:用于声明浮点类型的变量,
float
为单精度,double
为双精度。 - 作用:存储带有小数部分的数值。
- 语法表达:
float 变量名;
或double 变量名;
- 示例:
float price = 9.99f;
double pi = 3.1415926;
3.char
- 定义:用于声明字符类型的变量。
- 作用:存储单个字符,实际存储的是字符的 ASCII 码值。
- 语法表达:
char 变量名;
- 示例:
char grade = 'A';
char initial = 'J';
4.bool
- 定义:用于声明布尔类型的变量。
- 作用:存储逻辑值,只有
true
和false
两个值。 - 语法表达:
bool 变量名;
- 示例:
bool isStudent = true;
bool hasLicense = false;
④控制流关键字
1.if-else
- 定义:用于基于条件执行不同的代码块。
- 作用:实现分支逻辑。
- 语法表达:
if (条件表达式) {// 条件为真时执行的代码
} else {// 条件为假时执行的代码
}
- 示例:
int score = 85;
if (score >= 60) {cout << "及格" << endl;
} else {cout << "不及格" << endl;
}
2.switch
- 定义:基于一个表达式的值,选择执行多个代码块中的一个。
- 作用:替代多个
if-else
语句,使代码更清晰。 - 语法表达:
switch (表达式) {case 值1:// 表达式等于值1时执行的代码break;case 值2:// 表达式等于值2时执行的代码break;default:// 表达式不等于任何 case 时执行的代码
}
- 示例:
int day = 3;
switch (day) {case 1:cout << "星期一" << endl;break;case 2:cout << "星期二" << endl;break;default:cout << "其他" << endl;
}
3.for
- 定义:用于实现循环结构,在条件满足时重复执行代码块。
- 作用:简化需要重复执行的代码。
- 语法表达:
for (初始化表达式; 条件表达式; 递增/递减表达式) {// 循环体
}
- 示例:
for (int i = 0; i < 5; i++) {cout << i << endl;
}
4.while / do-while
- 定义:
while
在循环开始时检查条件,do-while
在循环结束时检查条件。 - 作用:实现循环逻辑。
- 语法表达:
while (条件表达式) {// 循环体
}do {// 循环体
} while (条件表达式);
- 示例:
int i = 0;
while (i < 5) {cout << i << endl;i++;
}int j = 0;
do {cout << j << endl;j++;
} while (j < 5);
⑤函数与类关键字
1.void
- 定义:表示无返回值或无参数类型。
- 作用:用于函数返回类型或参数列表中。
- 语法表达:
void 函数名();
或返回类型 函数名(void);
- 示例:
void printHello() {cout << "Hello" << endl;
}
2.return
- 定义:用于从函数中返回值并终止函数执行。
- 作用:将结果返回给函数调用者。
- 语法表达:
return 表达式;
或return;
(用于void
函数) - 示例:
int add(int a, int b) {return a + b;
}
3.class
- 定义:用于定义类,类是面向对象编程的基本单元。
- 作用:封装数据和方法,实现数据隐藏和继承。
- 语法表达:
class 类名 {访问修饰符:成员变量;成员函数;
};
- 示例:
class Rectangle {
private:int width, height;
public:int getArea() { return width * height; }
};
4.public / private / protected
- 定义:访问修饰符,用于控制类成员的访问权限。
- 作用:实现封装,保护数据不被随意访问。
- 语法表达:在类定义中使用。
- 示例:
class Person {
private:string name;
protected:int age;
public:void setName(string n) { name = n; }
};
⑥内存管理关键字
1.new / delete
- 定义:用于动态分配和释放内存。
- 作用:在运行时创建和销毁对象。
- 语法表达:
类型* 指针名 = new 类型;
delete 指针名;
- 示例:
int* ptr = new int;
*ptr = 100;
delete ptr;
2.static
- 定义:用于声明静态变量或函数。
- 作用:静态变量在程序的整个生命周期内存在,静态函数属于类而不是对象。
- 语法表达:
static 类型 变量名;
或static 返回类型 函数名();
- 示例:
class Counter {
public:static int count;static int getCount() { return count; }
};
int Counter::count = 0;
⑦其他关键字
1.const
- 定义:用于声明常量,保证变量值不被修改。
- 作用:提高程序的安全性和可读性。
- 语法表达:
const 类型 变量名 = 值;
或类型 const 变量名 = 值;
- 示例:
const int MAX_SIZE = 100;
2.friend
- 定义:用于声明友元函数或友元类。
- 作用:允许非成员函数或其他类访问当前类的私有和保护成员。
- 语法表达:
friend 返回类型 函数名(参数列表);
或friend class 类名;
- 示例:
class Point {
private:int x, y;friend void printCoordinates(Point p);
};
void printCoordinates(Point p) {cout << "(" << p.x << ", " << p.y << ")" << endl;
}
3.this
- 定义:指向当前对象的指针。
- 作用:在类的成员函数中访问当前对象的成员。
- 语法表达:
this->成员名
- 示例:
class Circle {
private:double radius;
public:Circle(double r) { this->radius = r; }
};
六、标识符命名规则
①作用:C++规定给标识符(变量、常量)命名时,有一套自己的规则。
- 标识符不能是关键字
- 标识符只能由字母、数字、下划线组成
- 第一个字符必须为字母或下划线
- 标识符中字母区分大小写
②建议:给标识符命名时,争取做到见名知意的效果,方便自己和他人的阅读。