【C++】C++入门基础,详细介绍命名空间,缺省参数,函数重载,引用,内联函数等

目录

1. 命名空间

1.1 使用命名空间的目的

1.2 命名空间定义 

1.3 命名空间使用

2. 缺省参数

2.1 缺省参数概念

2.2 缺省参数分类

2.3 实际案例

2.4 注意事项 

3. 函数重载

3.1 函数重载概念

3.2 函数重载原理 

4. 引用

4.1 引用的概念

4.2 引用的特性

4.3 使用场景

4.4 常引用(权限变化) 

4.5 引用和指针的区别 

5. 内联函数

5.1 概念

5.2 特性 

5.3 面试题

6. auto

7. 范围for

8. nullptr


1. 命名空间

1.1 使用命名空间的目的

在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多重名冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。


#include <stdio.h>
#include <stdlib.h>

int rand = 10;

int main()
{
    printf("%d\n", rand);
    return 0;
}

在C语言中,这个整型变量rand和函数rand()名字冲突了,只能其中一个改名字。

1.2 命名空间定义 

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。

1. 命名空间中可以定义变量/函数/类型

namespace lyh
{
    int rand = 10;

    int Add(int left, int right)
    {
        return left + right;
    }

    struct Node
    {
        struct Node* next;
        int val;
    };
}

使用方法

结构体类型的使用需要特别记忆一下。

int main()
{
    printf("%d\n", lyh::rand);

    printf("%d\n", lyh::Add(1, 2));

    struct lyh::Node node;

    return 0;
}

2. 命名空间可以嵌套

namespace N1
{
    int a;
    int b;
    int Add(int left, int right)
    {
        return left + right;
    }

    namespace N2
    {
        int c;
        int d;
        int Sub(int left, int right)
        {
            return left - right;
        }
    }
}

3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

4. 一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

1.3 命名空间使用

namespace lyh
{
    int a;
    int b;
}

1. 不展开,都要加命名空间名称及作用域限定符。

int main()
{
    printf("%d\n", lyh::a);
    printf("%d\n", lyh::b);

    return 0;
}

2. 部分展开,展开的不用加命名空间名称及作用域限定符。

using lyh::b;

int main()
{
    printf("%d\n", lyh::a);
    printf("%d\n", b);

    return 0;
}

3. 全展开,都不用加命名空间名称及作用域限定符。

using namespace lyh;

int main()
{
    printf("%d\n", a);
    printf("%d\n", b);

    return 0;
}

2. 缺省参数

2.1 缺省参数概念

缺省参数是声明或定义函数时为函数的参数指定一个默认值。

在调用该函数时,如果没有指定实参则采用该形参的默认值,否则使用指定的实参。

void Func(int a = 0)
{
     cout<<a<<endl;
}

int main()
{
     Func();     // 没有传参时,使用参数的默认值,a=0
     Func(10);   // 传参时,使用指定的实参,a=10

     return 0;
}

2.2 缺省参数分类

1. 全缺省参数

void Func(int a = 10, int b = 20, int c = 30)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }

int main()
{
    Func();
    //只能从左往右显示传参。
    Func(1);
    Func(1, 2);
    Func(1, 2, 3);

    return 0;
}

2. 半缺省参数

部分参数缺省,缺省参数必须从右往左给出。

void Func(int a, int b = 10, int c = 20)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }

int main()
{
    Func(1);
    Func(1, 2);
    Func(1, 2, 3);

    return 0;
}

2.3 实际案例

假如有一个场景要你开空间,这里分为两种情况,1.你知道开多少,2.你不知道开多少,这里就可以使用缺省参数。

再开空间之前你需要传入一个关于空间大小的参数,给空间大小参数一个默认值,你知道你就传,你不知道就用默认的。 

2.4 注意事项 

1. 缺省参数不能在函数声明和定义中同时出现。规定声明给即可。

 //a.h
  void Func(int a = 10);
  
  // a.cpp
  void Func(int a = 20)
 {}
  
  // 注意:如果声明与定义都有缺省值,恰巧两个缺省值不同,那编译器就无法确定到底该用那个缺省值。

2. 缺省值必须是常量或者全局变量。

3. C语言不支持缺省参数(编译器不支持)。


3. 函数重载

3.1 函数重载概念

C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

1. 参数类型不同

int Add(int left, int right)
{
     return left + right;
}

double Add(double left, double right)
{
     return left + right;
}

2. 参数个数不同

void f(int a)
{
     ...
}

void f(int a, int b)
{
     ...
}

3. 参数类型顺序不同

void f(int a, char b)
{
     ...
}

void f(char a, int b)
{
     ...
}

3.2 函数重载原理 

1. 一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。

2. 编译进行了符号汇总,汇编形成符号表,链接进行了符号表的合并与重定位。

3. C++不像C语言直接把函数名当作符号,而是将函数名修饰后才变成符号。

4. 通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。


4. 引用

4.1 引用的概念

1. 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

2. 类型& 引用变量名(对象名) = 引用实体。

void Test()
{
    int a = 10;
    int& ra = a;
}

3. 引用类型必须和引用实体是同种类型的。

4.2 引用的特性

1. 引用在定义时必须初始化。

2. 一个变量可以有多个引用。也可以对引用进行引用。

3. 引用一旦引用了一个实体,就不能引用其他实体。

void Test()
{
   int a = 10;

   int& ra; //没有初始化
   int& ra = a;

   int& rra = ra; //可以对引用进行引用  

   int x = 1;
   ra = x; //这里是赋值
}

4.3 使用场景

1. 做参数

void Swap(int& left, int& right)
{
   int temp = left;
   left = right;
   right = temp;
}

2. 做返回值

注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用 引用返回,如果已经还给系统了,则必须使用传值返回。

4.4 常引用(权限变化) 

1. 在引用的过程中,权限可以平移,缩小,但不能放大。

void Test()
{
    const int a = 10;

    int& ra = a; //这是权限放大,不行。
    int b = a; //这是赋值,可以。

    const int& ra = a; //这是权限平移。

    int x = 10;
    const int& rx = x; //这是权限缩小。
}

2. 临时变量具有常性

void test()
{
    int i = 12
    double d = i;

    double& rd = i; //这句会出错。 
    const double& rd = i;
}

因为这里会进行类型转换,将i拷贝给类型为double的临时变量,此时是对临时变量起别名。


func结束后,返回值会拷贝给一个临时变量,对临时变量起别名要注意常性。

4.5 引用和指针的区别 

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

他们的汇编代码是一样的。


引用和指针的不同点:

1. 引用概念上定义一个变量的别名,指针存储一个变量地址。

2. 引用在定义时必须初始化,指针没有要求。

3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体。

4. 没有NULL引用,但有NULL指针。

5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数

6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。

7. 有多级指针,但是没有多级引用。

8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理。

9. 引用比指针使用起来相对更安全。


5. 内联函数

5.1 概念

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。

5.2 特性 

1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会 用函数体替换函数调用。

缺陷:可能会使目标文件变大。

优势:少了调用开销,提高程序运行效率。

2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建 议:将函数规模较小、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。

3. 内联说明只是向编译器发出一个请求,编译器可以选择忽略这个请求。

4. inline不能声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址 了,链接就会找不到。

5.3 面试题

宏的优缺点?

优点: 1.没有类型限制。 2.针对频繁调用的小函数不用建立栈帧。

缺点: 1.不能调试宏(因为预编译阶段进行了替换) 。2.容易出错。 3.没有类型安全的检查 。


C++有哪些技术替代宏?

1. 常量定义 换用const enum。 2. 短小函数定义 换用内联函数。


6. auto

根据右边自动推导左边的类型。

int main()
{
    int a = 1;
    auto b = a;
    auto c = &a;

    cout << typeid(b).name() << endl;
    cout << typeid(c).name() << endl;
    cout << typeid(d).name() << endl;
}

typeid可以查看变量的类型。 


auto不能推导的场景

1. auto不能作为函数的参数。

2. auto不能直接用来声明数组。


7. 范围for

void Test()
{
    int array[] = { 1, 2, 3, 4, 5 };
   
    for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p)
    {
         cout << *p << endl;
    }

    for(auto e : array)
    {
         cout << e << " ";
    }
    cout << endl;
}

依次取数组中的数据赋值给e。

自动判断结束。

自动迭代。


8. nullptr

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

 在C++中,NULL被定义为0。所以要表示空指针就使用nullptr。

1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入 的。

2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。

林宇恒/code-cpp (gitee.com) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/873930.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(计算机网络)运输层

一.运输层的作用 运输层&#xff1a;负责将数据统一的交给网络层 实质&#xff1a;进程在通信 TCP&#xff08;有反馈&#xff09;UDP&#xff08;无反馈&#xff09; 二.复用和分用 三. TCP和UDP的特点和区别 进程号--不是固定的 端口号固定--mysql--3306 端口--通信的终点 …

【重学 MySQL】十二、SQL 语言的规则与规范

【重学 MySQL】十二、SQL 语言的规则与规范 基本规则注释语法规则命名规则基本命名规则具体命名规范其他注意事项 数据导入指令 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;的规则与规范是确保SQL语句能够正确执行、提高代码可读性和可维…

数据结构C //线性表ADT结构及相关函数

数据结构&#xff08;C语言版&#xff09;严蔚敏 吴伟民 线性表ADT结构及相关函数 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块&#xff08;头文件&#xff0c;函数文件&#xff0c;主文件&#xff09; list.h头文件 /****…

11大排序的原理讲解和Python源码剖析

排序算法 【谁教你这么剪的 | 11大排序的原理讲解和Python源码剖析】 https://www.bilibili.com/video/BV1Zs4y1X7mN/?share_sourcecopy_web&vd_sourceed4a51d52f6e5c9a2cb7def6fa64ad6a 稳定&#xff1a;如果a原本在b前面&#xff0c;而ab&#xff0c;排序之后a仍然在b…

金士顿NV2 2TB假固态硬盘抢救记,RL6577/RTS5765DL量产工具,RTS5765DL+B47R扩容开卡修复

之前因为很长时间不买固态硬盘&#xff0c;没注意到NVME的固态盘也有了假货和扩容盘&#xff0c;花200多块买了个2TB的金士顿NV2固态硬盘&#xff0c;我原本以为NV1的假货最多是用黑片冒充正片&#xff0c;结果没想到NV2居然有扩容的。后来发现是扩容盘的时候&#xff0c;已经过…

亿发进销存一体化解决方案:数据互联互通,优化企业全局管理-下

亿发软件凭借对产品、市场、业务的深入理解&#xff0c;在进销存基础上进行了延伸&#xff0c;推出多终端、一体化的“进销存管理系统”多元产品矩阵。在技术上实现电脑端、手机端、PDA端、零售端、商家版以及小程序商城的多终端无缝对接&#xff0c;保障企业业务的连贯性和效率…

Win10安装.net FrameWork3.5失败解决方法

win10安装.net FrameWork3.5失败解决方法 已经好久没有来投稿了,实在最近业务缠身,忙的焦头烂额(呵~多么伟大的牛马) 但最近开发使用windows11实在是拉胯的不行,升级完就后悔,所以就一怒之下,重装了win10 可是,好家伙,我重装完遇到一个问题,就是在使用.Net Framework3.5,按照Mi…

Zynq7020 SDK 初学篇(4)- PL 端 GPIO

1.开发背景 基于 PS 端 GPIO 的基础上&#xff0c;如何调用 PL 端 GPIO 的输入输出 2.开发需求 PL 端按键控制 PL 端 LED 3.开发环境 Zynq7020 Vivado2017.4 4.实现步骤 4.1 设计配置 这里设置 PIO 数量 3 个 由于 PL 端不像 PS 端一样绑定 GPIO&#xff0c;所以需要对上面…

C++:拷贝构造函数、赋值运算符重载

目录 一、拷贝构造函数 拷贝构造的特点 二、赋值运算符重载 2.1 运算符重载 2.2 赋值运算符重载 赋值运算符重载的特点 一、拷贝构造函数 如果一个构造函数的第一个参数是自身类类型的引用&#xff0c;且任何额外的参数都有默认值&#xff0c;则此构造函数也叫做拷贝构造…

【Python篇】matplotlib超详细教程-由入门到精通(上篇)

文章目录 第一部分&#xff1a;基础概念与简单绘图1.1 matplotlib 简介1.2 创建第一个折线图1.3 图表的基本组成元素 第二部分&#xff1a;图表样式与修饰2.1 修改图表样式2.2 添加图例2.3 调整坐标轴与刻度 第三部分&#xff1a;绘制不同类型的图表3.1 散点图 (Scatter Plot)3…

JVM 调优篇2 jvm的内存结构以及堆栈参数设置与查看

一 jvm的内存模型 2.1 jvm内存模型概览 二 实操案例 2.1 设置和查看栈大小 1.代码 /*** 演示栈中的异常:StackOverflowError** author shkstart* create 2020 下午 9:08** 设置栈的大小&#xff1a; -Xss (-XX:ThreadStackSize)** -XX:PrintFlagsFinal*/ public class S…

关于ansible自动化运维工具

成长路上不孤单&#x1f60a;【14后&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

Android SystemUI组件(05)状态栏-系统状态图标显示管理

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注下方 SystemBars分析中状态栏中的部分-系统状态图标显示&管理 即可。 1 系统状态图标显…

Error when attempting to add data source to Azure OpenAI api

题意&#xff1a;尝试向 Azure OpenAI API 添加数据源时出现错误 问题背景&#xff1a; My code is working for a call to Azure OpenAI when I dont have a datasource added. However, when I do add my datasource with the following parameters I get an error: 当我没…

Dubbo精要

1、为什么需要 Dubbo&#xff1f; 分布式系统中的服务调用和协调问题&#xff1a;在分布式系统中&#xff0c;服务之间的相互依赖会导致复杂的通信和协调问题。Dubbo提供了高效的服务调用和自动注册、发现等功能&#xff0c;使得构建分布式应用程序更加容易。服务治理和服务调…

LeetCode 热题 100 回顾5

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

CentOS Stream 8中安装和使用 Docker

docker安装包-CSDN博客 〇、常用的docker命令 docker的作用&#xff1a; 快速进行软件的安装&#xff0c;便于软件环境的维护 docker的镜像: 压缩了指定软件的安装包的文件。使用镜像文件创建容器 docker的容器: 容器可以理解为就是一台小电脑。安装的linux系统&am…

C++入门基础篇

引言 说到编程语言常常听到的就是C语言C Java 。C语言是面向过程的&#xff0c;C是和Java是面向对象的&#xff0c;那么什么是面向对象呢&#xff1f;什么又是面向过程呢&#xff1f;C是什么&#xff1f;封装、继承、多态是什么&#xff1f;且听我絮絮叨叨。 C入门基础 1.命名…

SpringBoot OAuth2自定义登陆/授权页

背景 5 月份的时候&#xff0c;我实践并整理了一篇博客&#xff1a;SpringBoot搭建OAuth2&#xff0c;该博客完成之后&#xff0c;很长一段时间里我都有种意犹未尽的感觉。诚然&#xff0c;我把OAuth2搭起来了&#xff0c;各种场景的用例也跑通了&#xff0c;甚至源码也看了&am…

《花100块做个摸鱼小网站! 》第六篇—将小网站部署到云服务器上

⭐️基础链接导航⭐️ 服务器 → ☁️ 阿里云活动地址 看样例 → &#x1f41f; 摸鱼小网站地址 学代码 → &#x1f4bb; 源码库地址 一、前言 到这一篇我们终于把环境搭好&#xff0c;也做好了几个热搜小组件&#xff0c;为了让我们方便展示成果或者方便自己摸鱼&#xff0c…