C++: 命名空间/C++输入输出/缺省参数/函数重载/引用/内联函数

本文主要是介绍C++: 命名空间/C++输入输出/缺省参数/函数重载/引用/内联函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

进入C++以后,就翻开了新的篇章。C++支持C语言的使用。事实上,C++是创建者在发现C语言中有很多不好用的地方(在后续学习中会明显看到)后,在C语言基础上又加入了许多语法,于是就成了C++。

1.命名空间

来源:在C语言中,同一个作用域内,可能会发生命名重复,命名冲突的问题。如果代码量一多,那么命名冲突很难避免。在C++中,就增加了命名空间。

定义:namespace + 空间的名字 。空间名字是自定义的。比如zhangsan。

namespace zhangsan
{int rand = 0;int add(int a, int b){return a+b;}struct STNode{int val;STNode* next;};
}

这样就把自己定义的函数,变量,结构体限定在这个命名空间内。那么别人就不能随意访问了。除了定义变量、函数和结构体外,命名空间也可以嵌套。

命名空间的访问

1.空间名::成员名。   ::这个符号是作用域限定符。

int main ( )
{int a = zhangsan::rand;return 0;
}

2.用using 将命名空间的某个成员引入。个人理解,这相当于把这个空间内的成员声明在想使用的地方了。

using zhangsan::rand;
int main()
{int a = rand;return 0;
}

3.using namespace 空间名。和2有点相似,上面展开的只是某个成员,现在展开的是这个空间了。

using namespace zhangsan;
int main()
{int a = rand;add(2,3):struct STNode s1;return 0;
}

如上图所示,此时在main函数中就可以不加限定范围操作符而使用命名空间中的各种成员了。

2.C++输入和输出

#include <iostream>
using namespace std;int main()
{cout<<"hello"<<endl;return 0;
}

注意

a.使用cout 标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含头文件<iostream>,以及按照命名空间使用方法 使用std。

b.cout 和cin 是全局的流对象,endl是特殊的C++符号,表示换行输出。他们都包含在<iostream>头文件中。

c.<<是流插入,>>是流提取。

d.C++的输入输出可以自动识别变量类型,而不需要手动添加占位符。

cout和cin分别是ostream和istream的对象,<< 和>>也涉及运算符重载。此处不做扩展。

早期标准库基本都在全局域中实现,想要用的时候加上对应的.h头文件就可以。为了和C语言进行区分,C++的头文件不再加.h后缀。因此推荐使用<iostream>和std的方式。

std是C++标准库的命名空间名字,C++将标准库的定义实现都放在这个命名空间中。如果只在某个区域内使用,不必要在全局用,以免自己命名和函数名相撞产生命名冲突这种问题。只需要展开常用的头文件就可以了。

#include <iostream>int main()
{using std::cout;cout<<"hehe"<<"  "<<endl;return 0;
}

3.缺省参数

缺省参数是声明或者定义函数时,给参数一个缺省值,在调用这个函数时,如果没给实参,就用默认的缺省值,如果给了实参就用实参。

void func(int i = 10)
{cout<<"i"<<endl;
}
int main()
{func();func(2);return 0;
}

缺省参数分为全缺省和半缺省。

a.全缺省就是每一个形参都给了缺省值。

b.半缺省是部分没给。但需要注意的是半缺省只能从右往左给值,中间不能隔几个不给的。

c.缺省参数不能在声明和定义同时出现,同时出现而缺省值给的不同,编译器就不知道给哪个值了,所以不能同时出现。

d.缺省值必须是常量。

e.C语言不支持。

4.函数重载

C++允许在同一作用域中,声明几个功能相似的同名函数。这些函数由于形参的不同(类型不同,类型的顺序不同,个数不同)而能够同时使用。就是构成了函数重载。这些不同不包括返回类型不同。

为什么C++支持函数重载,C语言不支持?

一个程序要运行起来,需要经过预处理、编译、汇编、链接四个阶段。

链接的时候,面对一个函数,C语言中链接器会用函数名去找这个函数。

C++不一样,每个编译器都有自己的函数名修饰规则,在gcc中,是Z+函数名长度+函数名+形参类型的首字母。所以由于函数形参不一样而找到对应的函数,不会找错和搞混。

C语言没办法支持重载,因为它只能通过函数名去找,没法区分。C++是通过函数修饰规则区分,参数不同,修饰的名字就不一样,所以能够支持重载。

5.引用

引用不是新定义了一个变量,而是给变量取了个别名,它和被引用的变量共用一块空间。只是把原来的变量换了一种叫法。

void func ( )
{int a = 10;int& b = a;cout<<"a"<<"  "<<"b"<<endl;cout<<"&a"<<"  "<<"&b"<<endl;
}

引用特性

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

2.一个变量可以有多个引用

3.引用一旦引用一个实体,再不能引用其他实体

使用须知

1.引用可以权限缩小,但不能权限放大。

比如被引用的变量是int,可以定义一个常属性的变量来引用。

但是当被引用的是常量,就不能定义一个变量来引用它了。

2.做参数

void swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}

3.做返回值

下面这种写法是错的。因为b的范围只在作用域内。出了作用域空间被销毁,b的值就是随机的了。而返回值是b的引用,所以返回值也是随机的。而m又是返回值的引用。m获取的数值也是随机的。非法访问不属于自己的空间。

int& add(int a, int b)
{b = a+1;return b;
}int main()
{int& m = add(1,0);return 0;
}

因此做返回值的时候,要保证返回值出了作用域后,在上一层调用的空间依然存在。才可以是合法的使用。这种情况,由于已经返回给操作系统了,所以不能用引用返回,只能用传值返回。

传值返回:以这个例子来说,main函数在调用add函数时,由于add有返回值,所以建立栈帧的时候会提前由寄存器提供一块临时空间用来拷贝返回的值。所以传值调用是有空间损耗的,如果返回的值太大,就不是寄存器提供的了。会产生更多的空间消耗。

传引用的话,并不会新开辟一块空间,而是在原变量上,同一块空间中进行操作。所以传引用比传值返回效率高很多。特别在返回的值比较大的时候。

引用和指针的区别

1.引用必须初始化,指针可以不初始化。

2.引用一旦引用了一个变量,就不能更改。指针可以随意更改指向的空间。

3.引用在sizeof使用时是变量占用的空间大小,而指针始终是4/8个字节。

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

5.引用自加是变量+1,指针是往后偏移一个类型大小

6.引用是定义变量别名,指针是储存地址

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

8.指针在访问实体时要解引用,引用是编译器自己处理

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

6.内联函数

以inline修饰的函数叫内联函数,内联函数在使用时,编译器在编译期间会把这个函数体直接展开,而不是调用。调用的话需要建立栈帧。就减少了这部分的空间开销。提升函数运行的效率。

特点

inline是一种以时间会空间的做法,虽然将函数体展开了减少了空间的损耗,但同时也会使目标文件变大。

内联函数对于编译器来说只是一个建议,不同编译器对于inline的实现机制是不一样的。很多编译器都不支持内联递归函数。内联函数一般用于代码量少、频繁调用、流程直接的函数。超过75行的函数不大可能在调用点内联地展开。

inline不支持声明和定义分离。因为inline被展开,就没有函数地址了。链接就找不到。

宏的优缺点?

优点:

1.不限类型

2.增强代码复用性

3.提高性能

缺点

1.不方便调试宏

2.没有类型检查,不安全

3.代码可读性差,可维护性差,容易误用。

C++中可以替代宏的部分功能有哪些?

1.短小函数可以用inline

2.常量定义用枚举,const enum。

这篇关于C++: 命名空间/C++输入输出/缺省参数/函数重载/引用/内联函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869550

相关文章

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.