C++函数知识点大全(一)

简介: 教程来源 https://xcfsr.cn/category/cloud.html 本文系统梳理C++函数核心知识:从基础定义、返回值(含引用/指针/移动语义)、重载规则、默认参数,到现代特性如Lambda、模板函数等,兼顾初学者体系构建与开发者深度参考。

函数是C++程序的基本组成单元,是代码复用和模块化设计的核心机制。C++在继承C语言函数特性的基础上,引入了众多强大的新特性:函数重载、默认参数、内联函数、Lambda表达式、函数对象、模板函数等,使得函数设计更加灵活和强大。本文将系统全面地梳理C++函数的核心知识点,从基础语法到现代C++高级特性,帮助初学者建立完整的知识体系,也为有经验的开发者提供深入的技术参考。
a7b1db4f-eb2c-4b46-8883-ad94ea9e956d.png

一、C++函数基础

1.1 函数定义与声明

cpp
#include <iostream>
using namespace std;

// 函数声明(原型)- 告诉编译器函数的存在
int add(int a, int b);
void printMessage(const string& msg);
double calculateArea(double radius);

// 函数定义 - 具体实现
int add(int a, int b) {
    return a + b;
}

void printMessage(const string& msg) {
    cout << msg << endl;
}

double calculateArea(double radius) {
    return 3.14159 * radius * radius;
}

int main() {
    int result = add(10, 20);
    printMessage("Hello, C++!");
    double area = calculateArea(5.0);

    cout << "结果: " << result << endl;
    cout << "面积: " << area << endl;

    return 0;
}

1.2 函数返回值

cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;

// 返回基本类型
int getValue() {
    return 42;
}

// 返回引用(避免拷贝)
const string& getName() {
    static string name = "张三";
    return name;  // 返回静态变量的引用是安全的
}

// 返回指针
int* createArray(int size) {
    int* arr = new int[size];
    for (int i = 0; i < size; i++) {
        arr[i] = i;
    }
    return arr;  // 调用者负责释放内存
}

// 返回vector(移动语义,高效)
vector<int> createVector(int size) {
    vector<int> vec;
    for (int i = 0; i < size; i++) {
        vec.push_back(i);
    }
    return vec;  // 编译器会优化(RVO/NRVO)
}

// 返回auto(C++14)
auto multiply(int a, int b) {
    return a * b;  // 自动推导返回类型
}

// 返回decltype(auto)(C++14)
decltype(auto) getValueRef(int& x) {
    return x;  // 返回引用
}

int main() {
    int val = getValue();
    cout << "值: " << val << endl;

    const string& name = getName();
    cout << "姓名: " << name << endl;

    int* arr = createArray(10);
    for (int i = 0; i < 10; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
    delete[] arr;  // 释放内存

    vector<int> vec = createVector(5);
    for (int n : vec) {
        cout << n << " ";
    }
    cout << endl;

    int x = 100;
    int& ref = getValueRef(x);
    cout << "引用值: " << ref << endl;

    return 0;
}

二、函数重载

2.1 重载基础

cpp
#include <iostream>
using namespace std;

// 函数重载:同一作用域内,函数名相同,参数列表不同

// 1. 参数个数不同
void print() {
    cout << "无参数" << endl;
}

void print(int x) {
    cout << "整数: " << x << endl;
}

void print(int x, int y) {
    cout << "两个整数: " << x << ", " << y << endl;
}

// 2. 参数类型不同
void display(int x) {
    cout << "int: " << x << endl;
}

void display(double x) {
    cout << "double: " << x << endl;
}

void display(const string& s) {
    cout << "string: " << s << endl;
}

// 3. 参数顺序不同
void show(int x, double y) {
    cout << "int-double: " << x << ", " << y << endl;
}

void show(double x, int y) {
    cout << "double-int: " << x << ", " << y << endl;
}

// 注意:不能仅靠返回值类型区分
// int func();   // 错误:与void func()无法区分
// void func();

int main() {
    print();
    print(10);
    print(10, 20);

    display(100);
    display(3.14);
    display("Hello");

    show(10, 3.14);
    show(2.71, 20);

    return 0;
}

2.2 重载与类型转换

cpp
#include <iostream>
using namespace std;

void func(int x) {
    cout << "int: " << x << endl;
}

void func(double x) {
    cout << "double: " << x << endl;
}

void func(char x) {
    cout << "char: " << x << endl;
}

void func(const char* x) {
    cout << "const char*: " << x << endl;
}

int main() {
    func(10);      // 精确匹配 int
    func(3.14);    // 精确匹配 double
    func('A');     // 精确匹配 char
    func("Hello"); // 精确匹配 const char*

    func(10L);     // long -> int 或 double? 优先 int
    func(3.14f);   // float -> double
    func(true);    // bool -> int (true->1)

    return 0;
}

2.3 重载解析规则

cpp
#include <iostream>
using namespace std;

// 重载解析优先级:
// 1. 精确匹配
// 2. 类型提升(char -> int, float -> double)
// 3. 标准转换(int -> double, int -> long)
// 4. 用户定义转换
// 5. 可变参数

void test(int x) {
    cout << "int: " << x << endl;
}

void test(long x) {
    cout << "long: " << x << endl;
}

void test(double x) {
    cout << "double: " << x << endl;
}

void test(...) {
    cout << "..." << endl;
}

int main() {
    test(10);      // int(精确匹配)
    test(10L);     // long(精确匹配)
    test(3.14);    // double(精确匹配)
    test('A');     // int(char提升为int)
    test(10.0f);   // double(float提升为double)
    test("hello"); // ...(没有匹配,走可变参数)

    return 0;
}

三、默认参数

3.1 默认参数基础

cpp
#include <iostream>
using namespace std;

// 默认参数:为函数参数提供默认值
// 规则:默认参数必须从右向左连续提供

// 正确:从右向左提供默认值
void greet(string name, string prefix = "Hello", string suffix = "!") {
    cout << prefix << ", " << name << suffix << endl;
}

// 错误示例:不能跳过中间参数
// void wrong(string name = "Guest", string prefix, string suffix = "!") { }

// 多个默认参数
void printLog(string msg, int level = 0, bool timestamp = true) {
    if (timestamp) {
        cout << "[LOG] ";
    }
    if (level > 0) {
        cout << "[Level " << level << "] ";
    }
    cout << msg << endl;
}

// 默认参数可以在声明和定义中分别指定(但不能重复)
// 通常在声明中指定默认值
void init(int x, int y = 100);  // 声明中指定默认值

void init(int x, int y) {       // 定义中不重复指定
    cout << "x=" << x << ", y=" << y << endl;
}

int main() {
    greet("张三");
    greet("李四", "Hi");
    greet("王五", "Welcome", "!!");

    printLog("系统启动");
    printLog("用户登录", 1);
    printLog("错误发生", 2, true);

    init(10);
    init(10, 200);

    return 0;
}

3.2 默认参数与函数重载

cpp
#include <iostream>
using namespace std;

// 默认参数可以替代部分重载
class Logger {
public:
    // 使用默认参数(推荐)
    void log(const string& msg, int level = 0, const string& tag = "INFO") {
        cout << "[" << tag << "] " << string(level, ' ') << msg << endl;
    }

    // 等价的函数重载(代码冗余)
    // void log(const string& msg) { log(msg, 0, "INFO"); }
    // void log(const string& msg, int level) { log(msg, level, "INFO"); }
};

int main() {
    Logger logger;
    logger.log("Message");
    logger.log("Warning", 2);
    logger.log("Error", 0, "ERROR");

    return 0;
}

来源:
https://xcfsr.cn/category/ai.html

相关文章
|
人工智能
上车吧,1000+claw概念域名来袭!
风口真正值钱的,从来不是最热闹的那一天,而是热闹之后,产品开始成片长出来的那一刻…
|
Kubernetes Java Docker
【K8S系列】Pod重启策略及重启可能原因
【K8S系列】Pod重启策略及重启可能原因
2485 0
|
3月前
|
JSON 前端开发 API
用Pydantic实现Python数据校验的最佳实践
本文以小张调试用户注册报错为引,生动揭示Python后端数据校验混乱的痛点:规则散落、类型错误频发、业务逻辑被校验淹没。随即引出Pydantic解法——通过声明式模型(如`class User(BaseModel): username: str; age: int = Field(ge=18)`),实现自动类型转换、嵌套校验、字段约束与清晰错误提示,大幅提升代码可读性、健壮性与可维护性。(239字)
239 0
|
2月前
|
大数据 索引 Python
5个提升Python编码效率的实用技巧
5个提升Python编码效率的实用技巧
431 130
|
1天前
|
缓存 弹性计算 应用服务中间件
高端网站搭建:Nginx 反向代理与动静分离架构配置详解
在现代企业级 Web 架构中,Nginx 凭借其极低的内存消耗和超强的高并发处理能力,成为了不可或缺的流量网关。特别是在阿里云 ECS 实例搭配 Alibaba Cloud Linux 3 的环境下,Nginx 能够充分利用操作系统的网络栈优化,实现惊人的吞吐量。 本文将详细介绍如何配置 Nginx 的反向代理与动静分离,将静态资源请求与动态接口请求完美剥离,从而大幅提升网站的整体响应速度。
|
6月前
|
监控 安全 Unix
iOS 崩溃排查不再靠猜!这份分层捕获指南请收好
从 Mach 内核异常到 NSException,从堆栈遍历到僵尸对象检测,阿里云 RUM iOS SDK 基于 KSCrash 构建了一套完整、异步安全、生产可用的崩溃捕获体系,让每一个线上崩溃都能被精准定位。
1829 136
|
7月前
|
人工智能 安全 搜索推荐
杭州AI开源生态大会·魔搭社区开发者嘉年华全回顾
11月22日,杭州AI开源生态大会暨“魔搭社区”开发者中心启用仪式在云谷中心举行。大会汇聚超3000名开发者,发布“两张清单”与AI开源政策包,启用首个线下开发者空间,推动开放、共建、共创的AI生态发展。
1186 10
|
25天前
|
人工智能 测试技术
豆包怎么导出 Word?整理写作草稿、表格和办公内容的流程
豆包内容转Word需兼顾格式与审校:短文本可直接复制,含标题/表格/代码者推荐导出Markdown后用DeepShare等工具转换,确保结构完整;所有AI生成内容均须人工核对事实、删冗余、补案例,方可正式交付。
|
2月前
|
人工智能 机器人 API
零技术上手!2026年4月阿里云轻量服务器OpenClaw一键部署与钉钉快速接入保姆级教程
2026年,阿里云轻量服务器部署OpenClaw已实现**一键购买、自动初始化、钉钉快速接入**的全流程标准化,零基础用户无需掌握任何技术,只需按本文步骤操作,15分钟即可搭建专属AI助理,实现钉钉群聊自动回复、任务自动化、内容生成等功能。核心关键在于**正确选择地域、放行18789端口、准确配置API Key与钉钉凭证、及时重启服务**,配合阿里云千问高性能模型或Coding Plan免费模型,即可长期稳定使用OpenClaw,把重复工作交给AI,专注高价值事务。
295 4
|
2月前
|
数据采集 缓存 安全
【HTTP】HTTP协议核心体系:请求方法与状态码全结构化解析(附《思维导图》)
本文系统解析HTTP/1.1请求方法与状态码:厘清安全/幂等本质,详解9种方法语义、约束与误区;全覆盖状态码全分类(1xx/2xx/3xx/4xx/5xx核心场景)的定义、场景及关键区分(如301/308、401/403、502/504);强调RESTful实践与高频红线,助力构建健壮、规范的Web服务。