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概念域名来袭!
风口真正值钱的,从来不是最热闹的那一天,而是热闹之后,产品开始成片长出来的那一刻…
|
5月前
|
编译器 项目管理 开发工具
【实测有效】Dev C++下载 | Dev C++免费下载安装保姆级教程(附官网安装包)
Dev-C++是一款轻量免费的Windows C/C++集成开发环境,基于MinGW GCC编译器,内置编辑器、调试器与项目管理功能。界面简洁、安装便捷、启动迅速,语法高亮、断点调试一应俱全,特别适合编程初学者和教学使用。(239字)
|
8月前
|
监控 安全 Unix
iOS 崩溃排查不再靠猜!这份分层捕获指南请收好
从 Mach 内核异常到 NSException,从堆栈遍历到僵尸对象检测,阿里云 RUM iOS SDK 基于 KSCrash 构建了一套完整、异步安全、生产可用的崩溃捕获体系,让每一个线上崩溃都能被精准定位。
2455 161
|
存储 网络协议 网络性能优化
计算机网络:快速了解网络框架
计算机网络:快速了解网络框架
463 0
|
计算机视觉
MATLAB--数字图像处理 添加高斯噪声
MATLAB--数字图像处理 添加高斯噪声
757 0
MATLAB--数字图像处理 添加高斯噪声
|
JSON API 数据格式
深入研究:淘宝天猫关键词搜索接口详解
淘宝和天猫提供关键词搜索商品的API接口,支持开发者按关键词获取商品列表及相关数据。功能包括通过搜索关键词(q)返回商品基本信息,如ID、标题、价格、图片、销量等。支持排序(sort)、分页(page_no/page_size)、价格区间筛选(start_price/end_price)及分类搜索(cat)。返回JSON格式数据,含商品ID、标题、价格、图片链接、详情页链接和销量等字段。
|
应用服务中间件 网络安全 nginx
nginx配置去掉路径中的指定字符
【6月更文挑战第25天】nginx配置去掉路径中的指定字符
1116 0
|
机器学习/深度学习 人工智能 自动驾驶
人工智能概述(二)
人工智能概述(二)
1584 0
|
7月前
|
人工智能 安全 JavaScript
Qoder节省 Credits 的最佳实践
本文介绍如何高效节省AI编程工具(如Qoder、Cursor)的Credits资源。通过新开窗口处理无关任务、按需选择模型、优化代码结构、明确输出需求、及时终止跑偏任务及使用工程化回滚等技巧,有效降低Token消耗,提升开发效率与成本控制。
2300 10
|
Kubernetes Java Docker
【K8S系列】Pod重启策略及重启可能原因
【K8S系列】Pod重启策略及重启可能原因
2575 0

热门文章

最新文章