从零开始学C++核心语法:从基础到面向对象
C++ 是一门融合了「过程式编程」和「面向对象编程」的静态编译型语言,兼具高效性和灵活性。本文将从新手视角,系统讲解 C++ 核心语法,包括库导入、命名空间、函数、条件判断、循环、类与对象等核心知识点,每个知识点配套可运行的代码示例,帮你快速掌握基础用法。
一、C++ 程序的基本结构
先看一个最简单的 C++ 程序,建立整体认知:
cpp
// 1. 导入库(头文件包含)
#include <iostream>
// 2. 命名空间使用(简化标准库调用)
using namespace std;
// 3. 函数定义(程序入口函数,必须有)
int main() {
// 4. 输出语句(标准库功能)
cout << "Hello, C++!" << endl;
// 5. 返回值(0 表示程序正常结束)
return 0;
}
运行结果:Hello, C++!
核心组成:
- 注释:
// 单行注释、/* 多行注释 */,用于代码说明,编译时会被忽略; - 头文件导入:
#include引入外部库/自定义代码; - 命名空间:解决命名冲突,简化代码调用;
- 函数:程序的基本执行单元,
main是程序入口; - 语句:以分号
;结尾,是最小执行单元。
二、导入库(头文件包含)
C++ 没有「导入」的概念,而是通过 #include 实现「文件包含」------ 将指定头文件的内容原封不动拷贝到当前文件中,解决「编译器找不到代码」的问题。
1. 两种包含方式
| 语法 | 用途 | 示例 |
|---|---|---|
#include <xxx> |
包含系统标准库头文件 | #include <iostream>(输入输出)、#include <string>(字符串)、#include <vector>(动态数组) |
#include "xxx" |
包含自定义头文件(本地文件) | #include "Book.h"(自定义图书类头文件) |
2. 常用标准库头文件
| 头文件 | 核心功能 |
|---|---|
<iostream> |
控制台输入(cin)、输出(cout) |
<string> |
字符串类型(std::string)操作 |
<vector> |
动态数组(std::vector) |
<cmath> |
数学函数(sqrt、pow 等) |
<cstdio> |
C 风格输入输出(printf/scanf) |
示例:使用多个标准库
cpp
#include <iostream> // 输入输出
#include <string> // 字符串
#include <cmath> // 数学函数
using namespace std;
int main() {
string name = "C++";
double num = 16;
cout << "Hello, " << name << "!" << endl;
cout << "16的平方根:" << sqrt(num) << endl; // 调用cmath的sqrt函数
return 0;
}
运行结果:
Hello, C++!
16的平方根:4
三、命名空间(namespace)
命名空间是 C++ 解决「命名冲突」的核心机制------给变量、函数、类加「前缀」,区分不同模块的同名元素,类比 Python 的「模块名」。
1. 核心概念
- 定义:用
namespace 命名空间名 { ... }包裹代码,将内容归属到该命名空间; - 访问:用
命名空间名::元素名访问,或用using简化调用; - 标准库命名空间:C++ 所有标准库内容(cout、string、vector 等)都在
std命名空间中。
2. 命名空间的三种使用方式
方式1:完整限定(最安全,无冲突)
cpp
#include <iostream>
// 不使用using,直接用std::限定
int main() {
std::cout << "完整限定调用标准库" << std::endl;
return 0;
}
方式2:引入单个元素(折中,简洁且安全)
cpp
#include <iostream>
// 只引入std::cout,其他仍需限定
using std::cout;
using std::endl;
int main() {
cout << "只引入单个元素" << endl;
return 0;
}
方式3:引入整个命名空间(简洁,可能冲突)
cpp
#include <iostream>
// 引入std所有内容,可直接用cout/endl
using namespace std;
int main() {
cout << "引入整个命名空间" << endl;
return 0;
}
3. 自定义命名空间
cpp
#include <iostream>
// 自定义命名空间(图书模块)
namespace Library {
// 命名空间内的函数
void printBook() {
std::cout << "图书模块:C++ Primer" << std::endl;
}
// 命名空间内的类
class Book {
public:
std::string name = "Python编程";
};
}
int main() {
// 访问自定义命名空间的函数
Library::printBook();
// 访问自定义命名空间的类
Library::Book book;
std::cout << "书名:" << book.name << std::endl;
return 0;
}
运行结果:
图书模块:C++ Primer
书名:Python编程
关键注意事项
- 不要在头文件中写
using namespace std;:会污染全局命名空间,导致其他文件命名冲突; - 命名空间可嵌套:
namespace A { namespace B { ... } },访问时用A::B::元素; - 同名命名空间会自动合并:分散在不同文件的同名命名空间,编译时会合并为一个。
四、函数定义与使用
函数是封装可复用逻辑的基本单元,C++ 函数必须明确「返回值类型」和「参数类型」,比 Python 更严谨。
1. 函数的基本语法
cpp
// 函数声明(可选,若定义在调用前可省略)
返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2);
// 函数定义(必须有,包含具体逻辑)
返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2) {
// 函数体(执行逻辑)
return 返回值; // 无返回值(void)则省略return
}
2. 核心规则
- 返回值类型:可以是
int、double、string等,无返回值用void; - 参数:必须指定类型,多个参数用逗号分隔;
- 函数调用:
函数名(参数值),参数数量/类型必须匹配。
3. 示例:不同类型的函数
cpp
#include <iostream>
#include <string>
using namespace std;
// 1. 无参数、无返回值函数
void printHello() {
cout << "Hello, 函数!" << endl;
}
// 2. 有参数、有返回值函数(加法)
int add(int a, int b) {
return a + b;
}
// 3. 字符串参数函数
string getBookInfo(string name, string author) {
return "书名:" + name + ",作者:" + author;
}
int main() {
// 调用无参数函数
printHello();
// 调用有参数函数,接收返回值
int sum = add(3, 5);
cout << "3+5=" << sum << endl;
// 调用字符串参数函数
string info = getBookInfo("C++ Primer", "Stanley Lippman");
cout << info << endl;
return 0;
}
运行结果:
Hello, 函数!
3+5=8
书名:C++ Primer,作者:Stanley Lippman
4. 函数重载(C++ 独有)
允许定义同名函数,只要「参数数量/类型/顺序」不同,编译器会自动匹配:
cpp
#include <iostream>
using namespace std;
// 重载1:两个int相加
int add(int a, int b) {
return a + b;
}
// 重载2:三个int相加
int add(int a, int b, int c) {
return a + b + c;
}
// 重载3:两个double相加
double add(double a, double b) {
return a + b;
}
int main() {
cout << add(1, 2) << endl; // 调用重载1:3
cout << add(1, 2, 3) << endl; // 调用重载2:6
cout << add(1.5, 2.5) << endl; // 调用重载3:4
return 0;
}
五、条件判断(if-else / if-else if-else)
C++ 条件判断用于根据不同条件执行不同逻辑,语法和 Python 类似,但需注意「花括号」和「分号」的使用。
1. 基本语法
cpp
// 单条件
if (条件表达式) {
// 条件为true时执行
}
// 双条件
if (条件表达式) {
// 条件为true时执行
} else {
// 条件为false时执行
}
// 多条件
if (条件1) {
// 条件1为true时执行
} else if (条件2) {
// 条件2为true时执行
} else {
// 所有条件为false时执行
}
2. 核心规则
- 条件表达式:必须返回布尔值(
true/false),或可隐式转换为布尔值(如 0=false,非0=true); - 花括号
{}:若只有一行语句可省略,建议始终添加(避免逻辑错误); - 分号
;:仅用于表达式语句结尾,if/else后不加(否则会导致逻辑失效)。
示例:图书借阅判断
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
// 模拟图书是否借出
bool isBorrowed = true;
string bookName = "C++ Primer";
// 单条件判断
if (isBorrowed) {
cout << bookName << " 已借出,无法借阅!" << endl;
}
// 双条件判断
isBorrowed = false;
if (isBorrowed) {
cout << bookName << " 已借出" << endl;
} else {
cout << bookName << " 可借阅" << endl;
}
// 多条件判断(图书评分)
int score = 95;
if (score >= 90) {
cout << bookName << " 评分:优秀" << endl;
} else if (score >= 80) {
cout << bookName << " 评分:良好" << endl;
} else {
cout << bookName << " 评分:一般" << endl;
}
return 0;
}
运行结果:
C++ Primer 已借出,无法借阅!
C++ Primer 可借阅
C++ Primer 评分:优秀
六、循环(while / for)
循环用于重复执行一段逻辑,C++ 支持 while、do-while、for 三种循环,核心是「循环条件」和「终止逻辑」。
1. while 循环
「先判断,后执行」,适合循环次数不确定的场景。
cpp
// 语法
while (循环条件) {
// 循环体
// 必须有终止条件(如i++),否则死循环
}
示例:打印 1~5 的数字
cpp
#include <iostream>
using namespace std;
int main() {
int i = 1;
// 循环条件:i <= 5
while (i <= 5) {
cout << "i = " << i << endl;
i++; // 终止条件:i递增,最终超过5
}
return 0;
}
运行结果:
i = 1
i = 2
i = 3
i = 4
i = 5
2. do-while 循环
「先执行,后判断」,至少执行一次循环体。
cpp
#include <iostream>
using namespace std;
int main() {
int i = 6;
do {
cout << "i = " << i << endl;
i++;
} while (i <= 5); // 条件为false,但仍执行一次
return 0;
}
运行结果:i = 6
3. for 循环
「初始化 + 条件 + 递增」,适合循环次数确定的场景,语法更简洁。
cpp
// 语法
for (初始化表达式; 循环条件; 递增/递减表达式) {
// 循环体
}
示例:遍历图书列表
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
// 图书列表(数组)
string books[] = {"C++ Primer", "Python编程", "数据结构与算法"};
// 数组长度:总字节数 / 单个元素字节数
int len = sizeof(books) / sizeof(books[0]);
// for循环遍历
for (int i = 0; i < len; i++) {
cout << "第" << i+1 << "本书:" << books[i] << endl;
}
return 0;
}
运行结果:
第1本书:C++ Primer
第2本书:Python编程
第3本书:数据结构与算法
4. 循环控制关键字
break:立即终止整个循环;continue:跳过当前循环,进入下一次循环。
示例:
cpp
#include <iostream>
using namespace std;
int main() {
// break:打印1~3后终止
for (int i = 1; i <= 5; i++) {
if (i > 3) {
break;
}
cout << "break示例:i = " << i << endl;
}
// continue:跳过偶数,只打印奇数
for (int i = 1; i <= 5; i++) {
if (i % 2 == 0) {
continue;
}
cout << "continue示例:i = " << i << endl;
}
return 0;
}
运行结果:
break示例:i = 1
break示例:i = 2
break示例:i = 3
continue示例:i = 1
continue示例:i = 3
continue示例:i = 5
七、类的定义与使用(面向对象核心)
C++ 是面向对象语言,类(class)是封装「属性(变量)」和「行为(函数)」的核心载体,类比 Python 的类,但语法更严谨。
1. 类的基本结构
cpp
// 类的定义(通常写在头文件,如Book.h)
class 类名 {
// 访问控制符:private(默认)/ public / protected
private:
// 私有属性/函数:仅类内部可访问
类型 属性名;
public:
// 公有属性/函数:类外部可访问
// 构造函数(初始化对象,与类名同名,无返回值)
类名(参数列表) {
// 初始化属性
}
// 成员函数(类的行为)
返回值类型 函数名(参数列表) {
// 函数逻辑
}
};
2. 类的使用步骤
- 定义类(声明属性和函数);
- 实现类的成员函数(若头文件和源文件分离);
- 实例化对象(创建类的实例);
- 调用对象的属性/函数。
3. 完整示例:图书类
步骤1:定义类(Book.h)
cpp
#ifndef BOOK_H // 头文件保护,避免重复包含
#define BOOK_H
#include <string>
// 自定义命名空间
namespace Library {
class Book {
private:
// 私有属性:仅类内部可访问
std::string name; // 书名
std::string author; // 作者
bool isBorrowed; // 是否借出
public:
// 构造函数(初始化对象)
Book(std::string name, std::string author);
// 成员函数:借阅图书
bool borrowBook();
// 成员函数:归还图书
bool returnBook();
// 成员函数:打印图书信息
void showInfo();
};
}
#endif // BOOK_H
步骤2:实现类的成员函数(Book.cpp)
cpp
#include "Book.h"
#include <iostream>
namespace Library {
// 构造函数实现
Book::Book(std::string name, std::string author) {
this->name = name; // this指针:区分参数和成员变量
this->author = author;
this->isBorrowed = false; // 默认未借出
}
// 借阅函数实现
bool Book::borrowBook() {
if (isBorrowed) {
return false; // 已借出,失败
}
isBorrowed = true;
return true;
}
// 归还函数实现
bool Book::returnBook() {
if (!isBorrowed) {
return false; // 未借出,失败
}
isBorrowed = false;
return true;
}
// 打印信息实现
void Book::showInfo() {
std::cout << "书名:" << name << std::endl;
std::cout << "作者:" << author << std::endl;
std::cout << "状态:" << (isBorrowed ? "已借出" : "未借出") << std::endl;
}
}
步骤3:使用类(main.cpp)
cpp
#include "Book.h"
#include <iostream>
// 引入自定义命名空间的类
using Library::Book;
int main() {
// 实例化对象(创建图书)
Book book1("C++ Primer", "Stanley Lippman");
Book book2("Python编程", "Eric Matthes");
// 调用成员函数:打印信息
std::cout << "===== 图书1信息 =====" << std::endl;
book1.showInfo();
// 调用成员函数:借阅图书
bool borrowOk = book1.borrowBook();
if (borrowOk) {
std::cout << "\n图书1借阅成功!" << std::endl;
} else {
std::cout << "\n图书1借阅失败!" << std::endl;
}
// 再次借阅(失败)
borrowOk = book1.borrowBook();
if (!borrowOk) {
std::cout << "图书1重复借阅失败!" << std::endl;
}
// 归还图书
bool returnOk = book1.returnBook();
if (returnOk) {
std::cout << "图书1归还成功!" << std::endl;
}
// 打印归还后的信息
std::cout << "\n===== 图书1归还后信息 =====" << std::endl;
book1.showInfo();
return 0;
}
编译运行(Linux)
bash
# 编译:链接所有源文件
g++ main.cpp Book.cpp -o book_demo
# 运行
./book_demo
运行结果
===== 图书1信息 =====
书名:C++ Primer
作者:Stanley Lippman
状态:未借出
图书1借阅成功!
图书1重复借阅失败!
图书1归还成功!
===== 图书1归还后信息 =====
书名:C++ Primer
作者:Stanley Lippman
状态:未借出
4. 核心知识点
this指针:隐式指向当前对象,用于区分参数和成员变量(如this->name = name);- 访问控制:
private仅类内部访问,public外部可访问; - 构造函数:与类名同名,无返回值,用于初始化对象;
- 实例化:
Book book1(...)直接创建对象(栈实例),也可Book* book1 = new Book(...)(堆实例)。
八、总结
本文覆盖了 C++ 新手必备的核心语法,关键知识点总结:
- 库导入 :
#include <xxx>包含系统库,#include "xxx"包含自定义库,解决「找不到代码」的问题; - 命名空间 :
std是标准库命名空间,using namespace std简化调用,自定义命名空间解决命名冲突; - 函数:必须指定返回值和参数类型,支持重载(同名不同参数);
- 条件判断 :
if-else按条件执行逻辑,{}界定代码块,结尾不加;; - 循环 :
while适合次数不确定,for适合次数确定,break/continue控制循环; - 类与对象 :封装属性和行为,
private/public控制访问,构造函数初始化对象,this指针指向当前实例。
掌握这些语法后,可以尝试实现简单的小项目(如图书管理系统、计算器),通过实践巩固知识点。C++ 语法严谨,重点注意「分号」「花括号」「类型声明」的规范,避免常见的语法错误。