前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】学完c语言后的c++基础知识补充!(命名空间、输入和输出、缺省函数、函数重载、引用、内联函数代替宏、nullptr代替NULL)

【C++】学完c语言后的c++基础知识补充!(命名空间、输入和输出、缺省函数、函数重载、引用、内联函数代替宏、nullptr代替NULL)

作者头像
用户11292525
发布2024-09-26 11:15:21
570
发布2024-09-26 11:15:21
举报
文章被收录于专栏:学习

一. 命名空间

1. 定义

出现的意义:解决各种函数、关键词和类的名称冲突问题。

定义方式namespace + 命名空间的名字 + { }

(注意!}后面不加;)

  • namespace 是关键词
  • 命名空间的内容成员,可以是变量,函数,类型
  • 可嵌套定义
  • 同一个项目(工程)中允许存在多个相同名称的命名空间,编译器最后会合并到一个命名空间中。
代码语言:javascript
复制
namespace N1 
{
    //变量
    int a=1;
    int b=2;
    //函数
    int Add(int a, int b) {
        return a + b;
    }
    //结构体类型
    struct Node
    {
    struct Node* next;
    int val;
    };


    //在N1命名空间中嵌套定义N2
    namespace N2
    {
        int a=3;
    }

}

2. 访问

命名空间内部可直接访问,外部需指定出他属于的命名空间。

法一 用访问限定符(::)直接访问

代码语言:javascript
复制
int main() {
    printf("%d\n", N1::a);//1
    printf("%d\n", N1::N2::a);//3
    return 0;
}

法二 用using展开命名空间里某个单独的成员

代码语言:javascript
复制
using N1::b;
int main() {
    //对比 :printf("%d\n", N1::a);//1
    printf("%d\n", b);//2
    return 0;
}

法三 using展开命名空间的全部成员

代码语言:javascript
复制
using namespace N1;
int main() {
    printf("%d\n", a);//1
    printf("%d\n", b);//2
    return 0;
}

3. 说明

工程项目中:可能会产生命名冲突,所以把常用库里面一些对象或者类型展出来。

比如:using std::cin、using std::cout 等。

日常练习中:不在乎跟库命名冲突,所以可以把库的命名空间全部展开。

比如:using namespace std;

二. C++ 中的输入和输出

  • cin >> 标准输入
  • cout << 标准输出
  • 需要 <iostream>头文件 和 std的命名空间
代码语言:javascript
复制
#include <iostream>
using namespace std;//日常练习

using namespace std::cin;//建议项目工程时这么定义
using namespace std::cout;
代码语言:javascript
复制
int main() {
    int a;
    cin >> a;//10
    cout << a;//10
    return 0;
}

三. 缺省参数

1. 概念

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

调用该函数时,如果没有传对应的实参的值,则该参数就使用之前设定好的默认值(缺省值)。

代码语言:javascript
复制
// Func 函数有一个缺省参数
void Func(int a = 0)
{
	cout<<a<<endl;
}

int main()
{
	// 没有传参时,使用参数的缺省值
	Func();   
	// 传参时,使用指定的实参
	Func(10); 
}

2. 分类

1、全缺省(形参全部给定缺省)

代码语言:javascript
复制
void Func(int a = 1,int b = 2,int c = 3) {
    cout << a << endl;//1
    cout << b << endl;//2
    cout << c << endl;//3
}

2、半缺省参数(形参必须从右往左连续缺省,不可间隔缺省!)

代码语言:javascript
复制
void HalfFunc(int a, int b = 10, int c = 20) {
    cout << a << endl;//66
    cout << b << endl;//77
    cout << c << endl;//20
}

int main() {
    HalfFunc(66,77);
    return 0;
}

3. 注意事项

  1. 参数缺省时,必须从右往左连续缺省。
  2. 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参
  3. 缺省参数不能在函数的声明和定义中同时出现。如果声明和定义分离的话,建议在声明那里缺省,这样便于在头文件里查找修改。
  4. 缺省值必须是常量或者全局变量
  5. C语言不支持缺省参数(编译器不支持)

四. 函数重载

c++允许实现功能类似参数列表不同同名函数。

这里的参数列表不同指的是参数的类型、顺序、个数不同

构成函数重载的条件

1. 参数个数不同
代码语言:javascript
复制
void f(int a)
{ }
void f()
{ }
2. 参数类型不同
代码语言:javascript
复制
int f(int a)
{ }
double f(double a)
{ }
3. 参数顺序不同
代码语言:javascript
复制
void f(int a,char b)
{ }
void f(char b,int a)
{ }

注意事项

1. 返回类型不同不构成重载
代码语言:javascript
复制
// 返回值类型都为 int
int Add(int a, int b)    
{}

// 返回值类型为double
double Add(int a, int b) 
{}
2. 函数重载不可用缺省函数
代码语言:javascript
复制
void func(int a)
{}

void func(int a,int b=10)
{}

int main()
{
	// error:不明确到底是调用带缺省的还是不带缺省的
	func(10);
}

五. 引用

1. 概念

给已存在变量取别名,共用同一块内存空间,但编译器不会为该引用变量开辟内存空间。

(类似 林冲又叫豹子头,人民币又叫毛爷爷)

使用规则类型& 引用变量名 = 引用实体;

代码语言:javascript
复制
int main()
{
	int a = 10;
	int& ra = a;// ra 引用 a
    
//也可以给别名取别名
    int& rra = ra;// rra 引用 ra
	
	//a和ra和rra地址相同
	printf("%p\n", &a);
	printf("%p\n", &ra);
    printf("%p\n", &rra);
	return 0;
}

2. 注意事项

引用变量在定义时必须初始化,即必须有引用实体。

代码语言:javascript
复制
int& ra;//error

一个变量可以有多个引用。(人民币可以叫毛爷爷,也可以叫钞票)

一个引用对象只能引用一个实体。(毛爷爷只能是人民币的别名,不能是你爷爷)

3. 引用和const(访问权限的放大与缩小)

首先,我们知道的是 int 访问权限(可读可写)大于 const int(仅可读)。

我们要知道一个概念,引用的访问权限只可缩小,不可放大

代码语言:javascript
复制
int main()
{
	// error:权限放大
	const int a = 10;
	int& ra = a; 

    //正常编译:允许权限缩小
	int b = 10;
	const int& rb1 = b;//权限缩小
	int& rb2 = b;//权限相等
	return 0;
}
v

4. 使用及相比的优点

(1)代替指针传参
代码语言:javascript
复制
//减少了c语言中指针对地址的解引用操作,可以直接修改实参的值
void Swap(int& left, int& right)
{
	int temp = left;
	left = right;
	right = temp;
}
(2)做返回值
代码语言:javascript
复制
//函数返回值就是实参本身,减少了临时变量的创建,提高效率

//传引用返回
int& Count()
{
	static int n = 0;
	n++;
	//返回n本身
	return n;
}

//传值返回
int Count()
{
	static int n = 0;
	n++;
	//返回n的值的一份临时拷贝对象
	return n;
}

特别说明,引用返回容易造成的非法访问

5. 指针和引用的区别(精简三点!)

  • 引用不能指向空值(null),而指针可以。
  • 引用在使用时不需要解引用操作(不需要 * 符号),而指针需要。
  • 引用在定义时必须初始化,而指针可以在后续指向不同的对象。

六. 内联函数

1. 概念

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方把函数内容展开,从而替换对函数的调用,没有函数压栈的开销,内联函数可以提升程序运行的效率

代码语言:javascript
复制
//定义两个数相加的内联函数
inline int Add(int a, int b)
{
	return a + b;
}
  • 代码很长或者有递归的函数不适宜使用作为内联函数。inline是一种以空间换时间的做法,省去调用函数栈帧的开销。
  • inline不建议声明和定义分离,这样会导致链接错误。因为inline既要要被展开,就没有函数地址了,链接就会找不到

2. c++替代宏的方法

  • 常量定义 :换用const来修饰
  • 函数定义: 换用内联函数

七. nullptr与NULL

NULL 预处理后:0 (可能被定义为字⾯常量0,使用需要类型转换) nullptr 预处理后:(void*)0 (隐式地转换为指针类型,避免类型转换问题)

故在c++,可以使用nullptr代替NULL传递空指针。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一. 命名空间
    • 1. 定义
      • 2. 访问
        • 3. 说明
        • 二. C++ 中的输入和输出
        • 三. 缺省参数
          • 1. 概念
            • 2. 分类
              • 3. 注意事项
              • 四. 函数重载
                • 构成函数重载的条件
                  • 1. 参数个数不同
                  • 2. 参数类型不同
                  • 3. 参数顺序不同
                • 注意事项
                  • 1. 返回类型不同不构成重载
                  • 2. 函数重载不可用缺省函数
              • 五. 引用
                • 1. 概念
                  • 2. 注意事项
                    • 3. 引用和const(访问权限的放大与缩小)
                      • 4. 使用及相比的优点
                        • (1)代替指针传参
                        • (2)做返回值
                      • 5. 指针和引用的区别(精简三点!)
                      • 六. 内联函数
                        • 1. 概念
                          • 2. c++替代宏的方法
                          • 七. nullptr与NULL
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档