首页 > 编程语言 >c++参数 使用笔记

c++参数 使用笔记

时间:2024-05-31 22:32:13浏览次数:25  
标签:引用 笔记 传递 修改 参数 c++ Pass 指针

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:前言 – 人工智能教程

目录

函数两个返回值:

1. 按值传递(Pass by Value)

2. 按引用传递(Pass by Reference)

3. 按常量引用传递(Pass by Const Reference)

4. 按指针传递(Pass by Pointer)

5. 按常量指针传递(Pass by Const Pointer)

6. 按右值引用传递(Pass by Rvalue Reference)

总结


函数两个返回值:

QVector

传两个参数,一个引用,一个返回

public:
    ThpRecord getLatestRecord(QVector<int>& ids);
};

ThpRecord faceinit::getLatestRecord(QVector<int>& ids) {
    ThpRecord entity;

    // 创建一个 SQL 查询对象
    QSqlQuery query;
    // 执行查询,假设表名为 "thp_record"
    query.exec("SELECT userId, updated_at FROM thp_record ORDER BY updated_at DESC LIMIT 1");

    if (query.next()) {
        entity.userId = query.value(0).toInt();
        entity.updatedAt = query.value(1).toString();

        // 将查询到的 userId 添加到 ids 向量中
        ids.append(entity.userId);
    } else {
        qDebug() << "No record found or query failed:" << query.lastError().text();
    }

    return entity;
}

调用:

  faceinit fi;
    QVector<int> ids;

    ThpRecord latestRecord = fi.getLatestRecord(ids);

    if (latestRecord.userId != -1) {
        qDebug() << "Latest record - UserID:" << latestRecord.userId
                 << "Updated at:" << latestRecord.updatedAt;
        qDebug() << "IDs vector:" << ids;
    } else {
        qDebug() << "No record found.";
    }

在C++中,函数参数的传递方式和使用方法有多种,每种方式都有其特定的用途和适用场景。以下是对C++函数参数的总结:

1. 按值传递(Pass by Value)

  • 概念:传递参数的值,函数内部操作的是参数的副本。
  • 优点:不影响实际参数,保证了参数的安全性。
  • 缺点:对于大对象(如复杂的类对象),会产生性能开销,因为需要复制对象。
  • 示例
    void foo(int x) {
        x = 5; // 修改的是副本
    }
    

2. 按引用传递(Pass by Reference)

  • 概念:传递参数的引用,函数内部操作的是参数的实际对象。
  • 优点:效率高,因为不需要复制对象,可以修改实际参数。
  • 缺点:可能会导致意外修改实际参数,影响安全性。
  • 示例
    void foo(int &x) {
        x = 5; // 修改的是实际参数
    }
    

3. 按常量引用传递(Pass by Const Reference)

  • 概念:传递参数的常量引用,函数内部不能修改参数。
  • 优点:结合了按值传递和按引用传递的优点,效率高且保证了参数的安全性。
  • 缺点:没有明显缺点,推荐使用。
  • 示例
void foo(const int &x) {
    // x = 5; // 错误,不能修改x
}

4. 按指针传递(Pass by Pointer)

  • 概念:传递参数的指针,函数内部操作的是参数的地址。
  • 优点:可以修改实际参数,适合处理动态内存分配。
  • 缺点:需要处理指针的有效性,可能引发空指针异常。
  • 示例
void foo(int *x) {
    if (x != nullptr) {
        *x = 5; // 修改的是实际参数
    }
}

5. 按常量指针传递(Pass by Const Pointer)

  • 概念:传递参数的常量指针,函数内部不能修改参数。
  • 优点:保证参数的安全性,防止修改实际参数。
  • 缺点:同样需要处理指针的有效性。
  • 示例
  • void foo(const int *x) {
        // *x = 5; // 错误,不能修改x
    }
    

6. 按右值引用传递(Pass by Rvalue Reference)

  • 概念:传递参数的右值引用,用于高效移动资源。
  • 优点:主要用于移动语义和避免不必要的拷贝,提升性能。
  • 缺点:仅适用于右值,较为复杂。
  • 示例
void foo(int &&x) {
    x = 5; // 修改的是实际参数
}

总结

  • 按值传递:适用于简单数据类型或不需要修改的情况。
  • 按引用传递:适用于需要修改参数且不希望产生额外开销的情况。
  • 按常量引用传递:适用于传递大对象且不希望修改参数的情况。
  • 按指针传递:适用于动态内存和可变参数数量的情况。
  • 按常量指针传递:适用于动态内存但不希望修改参数的情况。
  • 按右值引用传递:适用于移动语义和优化性能的情况。

标签:引用,笔记,传递,修改,参数,c++,Pass,指针
From: https://blog.csdn.net/jacke121/article/details/139270992

相关文章

  • 【C++修行之道】类和对象(二)类的6个默认成员函数、构造函数、析构函数
    目录一、类的6个默认成员函数二、构造函数2.1概念2.2特性2.2.5自动生成默认构造函数不进行显示定义的隐患:2.2.6自动生成的构造函数意义何在?两个栈实现一个队列2.2.7 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。2.4 一般......
  • 【C++修行之道】类和对象(三)拷贝构造函数
    目录一、 概念二、特征 正确的拷贝构造函数写法:拷贝函数的另一种写法 三、若未显式定义,编译器会生成默认的拷贝构造函数。四、编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,还需要自己显式实现吗?深拷贝的写法:五、拷贝构造函数典型调用场景:六、总结:......
  • 阅读笔记5
    在短短一周的时间里,我快速浏览了一本关于软件工程的书籍,这让我对这个领域有了更深入的理解。软件工程,顾名思义,是将系统化、有序、可度量的方法应用于软件开发、运营和维护的过程。成功并非一蹴而就,而是通过不断积累逐步实现的。优秀的程序员也是通过日积月累的学习和经验积累而......
  • 阅读笔记4
     通过结对合作,令我意识到了编写程序不仅仅要自己能明白,也要便与他人查看和理解自己的程序。4.1大节提到的代码规范,我们编写代码时要注重代码风格规范和代码设计规范,无论是类名,对象名,缩进还是行宽什么的,在结对子编程时都要有所规定,不然到后面出现的类或是对象多了,就很容易混乱,分......
  • C++11中的新特性(2)
    C++111可变参数模板2emplace_back函数3lambda表达式3.1捕捉列表的作用3.2lambda表达式底层原理4包装器5bind函数的使用1可变参数模板在C++11之前,模板利用class关键字定义了几个参数,那么我们在编译推演中,我们就必须传入对应的参数,如下图函数模板所示(类模板也......
  • C++ 习题精选(1)
    这里写目录标题1.字符串相加2.字符串中的第一个唯一字符1.字符串相加题目描述:给定两个字符串形式的非负整数num1和num2,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如BigInteger),也不能直接将输入的字符串转换为整数形式。......
  • 07Linux学习笔记
    Day7Linux网络管理目录文章目录Day7Linux网络管理1.查看Windows网络配置(ipconfig)2.查看Linux网络配置3.指定LinuxIP方法一:3.1查看所有网络连接3.2修改指定网络连接的IP地址3.3重新启动网络连接方法二:3.4找到要编辑的文件3.5编辑完配置文件后,应用更改:4.主机名和......
  • Nginx 实战-02-nginx proxy_pass 服务代理访问 使用笔记 ubuntu nodejs
    前言大家好,我是老马。很高兴遇到你。我们为java开发者实现了java版本的nginxhttps://github.com/houbb/nginx4j如果你想知道servlet如何处理的,可以参考我的另一个项目:手写从零实现简易版tomcatminicat手写nginx系列如果你对nginx原理感兴趣,可以阅读:从零......
  • C++学习: 输入与输出
    一、输出使用cout函数,用<<分隔。注:需要头文件#include<iostream>,所有符号都为英文。例:#include<iostream>intmain(){cout<<"hello!"<<endl;//endl或'\n'换行return0;}输出结果:hello!endl就是endline(换行)的意思。二、输入一、普通输入......
  • 华为交换机配置实验项目笔记
    一、项目需求1、内网互通2、只有销售部vlan20可以访问外网3、技术部vlan10不能访问server1服务器涉及知识点:1.vlan虚拟局域网作用:隔离广播域2.链路聚合作用:增加链路带宽、冗余3.DHCP动态主机配置协议作用:动态分配IP地址4.静态路由5.ACL访问控制列表6.NAT网......