首页 > 编程语言 >c++(入门)

c++(入门)

时间:2024-11-24 20:33:54浏览次数:13  
标签:std 入门 int nullptr c++ 引用 内联 函数

1. 引用

引用的定义

引用是另一个变量的别名,它在声明时必须被初始化,并且一旦初始化后,它就始终引用那个变量。

引用的语法

引用的声明方式是在变量名前加上&符号。

引用的特点

  • 引用必须在声明时初始化。
  • 引用一旦初始化后,就不能再引用其他变量。
  • 引用不是独立的变量,它和它引用的变量实质上是同一个变量。(底层上是指向同一个变量的指针)

引用的使用场景

  • 作为函数参数,实现参数的按引用传递,允许函数直接修改传入的参数。
  • 用于简化复杂对象的操作。

基本引用

int main() {
    int a = 10;
    int &ref = a; // ref是a的引用

    ref = 20; // 通过引用修改a的值
    std::cout << a << std::endl; // 输出20,因为a的值被ref修改了

    return 0;
}

 引用作为函数参数

void swap(int &x, int &y) {
    int temp = x;
    x = y;
    y = temp;
}

int main() {
    int a = 10, b = 20;
    swap(a, b); // 交换a和b的值
    std::cout << "a: " << a << ", b: " << b << std::endl; // 输出 a: 20, b: 10

    return 0;
}

 

引用返回局部变量

需要注意的是,返回局部变量的引用是不安全的,因为局部变量在函数返回后其生命周期就结束了。

int &getValue() {
    static int value = 10; // 使用静态变量来保证生命周期
    return value;
}

int main() {
    int &ref = getValue(); // 获取引用
    ref = 20; // 修改引用
    std::cout << getValue() << std::endl; // 输出20,因为value被修改了

    return 0;
}

由于value是静态变量,它的生命周期不会在getValue函数调用结束后结束,因此返回它的引用是安全的。如果value不是静态变量,那么返回它的引用将导致未定义行为。

2. 内联函数

内联函数的定义

内联函数是一种特殊的函数,它在编译时会在每个调用点处展开函数体,从而避免了函数调用的开销。但是,是否真正内联由编译器决定。

内联函数的语法

在C++中,内联函数通过在函数定义前加上inline关键字来声明。

内联函数的特点

  • 内联函数通常用于频繁调用且函数体较小的场合。
  • 内联函数可以节省函数调用的开销,但可能会增加编译后的代码大小。
  • 内联函数对于编译器来说只是一个建议,编译器可能会忽略这个建议。

使用内联函数的注意事项

  • 不要将过于复杂的函数声明为内联,因为这将导致代码膨胀。
  • 构造函数和析构函数通常不应该声明为内联,除非它们非常简单。
inline int add(int a, int b) {
    return a + b;
}

int main() {
    int result = add(3, 4); // 在这里,编译器可能会将add函数体展开
    std::cout << "Result: " << result << std::endl; // 输出 Result: 7

    return 0;
}

 

add函数被声明为内联。当编译器编译main函数时,它可能会将add(3, 4)替换为3 + 4,这样就避免了函数调用的开销。

需要注意的是,内联函数的定义应该放在头文件中,因为内联函数需要在每个调用点展开,所以编译器需要在每个包含该头文件的源文件中看到函数的定义。如果内联函数的定义放在源文件中,可能会导致链接错误。

3. auto关键字(C++11)

auto的自动推导类型

  • auto关键字告诉编译器自动推导变量的类型。
  • 这使得代码更加简洁,尤其是在处理复杂类型或长类型名称时。
  • auto可以用于声明变量、函数返回类型、lambda表达式的参数等。
auto var = value; // 编译器会根据value的类型自动推导var的类型

 

使用auto时,应确保类型推导的结果是清晰和预期的,避免不必要的混淆。不能用于函数参数的类型推导,因为函数参数需要在函数声明时就确定类型。

4. 基于范围的for循环(C++11)

基本语法

for (declaration : expression) {
    // 循环体
}

 expression是你要遍历的序列(如数组、容器等),而declaration用于在每次迭代中声明一个变量,该变量将被初始化为序列中的下一个元素。

 遍历数组

int arr[] = {1, 2, 3, 4, 5};
for (int i : arr) {
    std::cout << i << std::endl; // 输出数组中的每个元素
}

遍历容器

std::vector<double> vec = {1.1, 2.2, 3.3, 4.4, 5.5};
for (double val : vec) {
    std::cout << val << std::endl; // 输出vector中的每个元素
}

 遍历字符串

std::string str = "Hello, World!";
for (char ch : str) {
    std::cout << ch; // 输出字符串中的每个字符
}
std::cout << std::endl;

 

在基于范围的for循环中,如果你需要修改元素的值,你应该使用引用(如int&auto&)来避免不必要的复制。如果你不希望修改元素,可以使用常量引用(如const int&const auto&)。如果元素类型是一个类类型,并且没有定义移动构造函数或移动赋值运算符,使用引用可以避免调用复制构造函数或复制赋值运算符,从而提高性能。

5. 指针空值---nullptr(C++11)

在C++11标准中,nullptr关键字被引入作为新的空指针常量。在此之前,C++程序通常使用NULL0来表示空指针。然而,这两种方法都有其缺点:

  • NULL在C++中被定义为整数0,但在某些情况下可能会导致类型不匹配的问题,尤其是当重载函数同时接受整数和指针参数时。
  • 直接使用数字0同样存在类型不匹配的问题,并且代码的可读性较差。

nullptr的引入解决了这些问题,它是一个特殊的字面量,类型为std::nullptr_t,它可以被隐式转换为任何指针类型或成员指针类型,但不能被转换为任何整数类型。

int* ptr = nullptr;       // 正确:nullptr可以赋值给整型指针
double* dptr = nullptr;   // 正确:nullptr可以赋值给双精度浮点型指针
void func(int*) {}
void func(int) {}

func(nullptr);            // 调用func(int*),而不是func(int)

class MyClass {
public:
    void memberFunc(int*) {}
};

MyClass obj;
obj.memberFunc(nullptr);   // 正确:nullptr可以传递给成员函数的指针参数

标签:std,入门,int,nullptr,c++,引用,内联,函数
From: https://blog.csdn.net/z6665454/article/details/144011118

相关文章

  • c++的类和对象(1)
    1.类的引入类的引入是面向对象编程(OOP)中的一个基本概念,它代表了面向对象编程范式的核心。在C++中,类(Class)是一种用户定义的数据类型,它将数据表示(属性)和操作数据的方法(函数)组合成一个单一的实体。 classClassName{//类的成员变量(属性)//类的成员函数(方法)public:......
  • 机器学习入门-Scikit-learn
    目录一.Sklearn基本介绍二.以鸢尾花数据集为例,理解基础运用1.导入包2.加载数据集3.数据预处理4.数据集拆分5.模型训练6.模型评估7.模型保存和加载三.碎碎念一.Sklearn基本介绍    scikit-learn是一个开源的Python机器学习库,提供了大量易于使用的工具和算法......
  • 深度学习入门- 梯度(Gradient)(一)
    目录一.梯度的数学基础1.复合函数2.链式法则3.驻点,极值点,鞍点4.偏导数5.梯度6. 梯度法一.梯度的数学基础1.复合函数    由多个函数构成的函数,比如z=(x+y)**2,由函数1: z=t**2和函数2: t=x+y构成。2.链式法则    如果某个函数由复合函数表示,则该复......
  • Pulsar 入门实战(6)--Rest API
    RestAPI是broker提供的关联API,JavaadminAPI和pulsar-adminCLI底层都是使用的RestAPI;本文主要介绍其基本使用,文中所使用到的软件版本:Pulsar3.3.0。1、Admin1.1、BOOKIES1.1.1、列出所有bookiecurlhttp://10.49.196.30:8080/admin/v2/bookies/all1.2、BROKER......
  • KTL 一个支持C++14写公式的K线工具 - 0.9.2版,通达信mdt全景数据复盘大盘,Qt自定义图表
    K,K线,Candle蜡烛图。T,技术分析,工具平台L,公式Language语言使用c++14,Lite小巧简易。项目仓库:https://github.com/bbqz007/KTL    国内仓库:https://gitee.com/bbqz007/KTL 当前0.9.2新添加功能基于QCharts跟通达信mdt数据文件。使用者能够使用QCharts自定义数据处理图表。......
  • C++象棋代码 (控制台版)
    C++象棋代码 在win7写的 如果有疑问可以在评论区问有bug也可以在评论区反馈我会不定期修复的下面上代码:#include <windows.h>#include <string>#include <iostream>#include <cmath>using namespace std;int main(){    void Chinese_chees_Int_H......
  • 【最新原创毕设】基于SpringBoot的图书管理系统+13714(免费领源码)可做计算机毕业设计JA
    目 录摘要1绪论1.1研究背景与意义1.2开发现状1.3论文结构与章节安排2 图书管理系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例分析......
  • 最新毕设-SpringBoot-高校科研成果管理系统-58574(免费领项目)可做计算机毕业设计JAVA、
    摘要随着科研规模和复杂度的增加,管理科研成果、经费申请等方面变得愈发困难,需要系统化的管理工具进行支持。并且科研活动产生的数据量庞大,也越来越来越多的成果涌现,需要有效的数据管理系统来对高校科研成果进行处理、审核和发布。科研成果还是高校评价学者和教师绩效的重要依......
  • (2024最新毕设合集)基于SpringBoot的校园共享厨房信息系统-72647|可做计算机毕业设计JAV
    目 录摘要第一章 绪论1.1选题背景与意义1.2研究现状1.3论文结构与章节安排第二章系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3操作可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例分......
  • KOA 入门,完善用户注册和登录逻辑
    在上次简单实现用户注册和登录逻辑的时候「传送门」,提到了很多优化的地方,在这里我们来解决优化这些问题。在开始之前,因为上次我们测试的时候创建了多个相同账号名字的账号,所以我们先进行强制同步模型来清空上次创建的相关数据。调用node./src/db/connect.js来处理相关逻辑。......