C++核心语法入门:从命名空间到nullptr的全面解析

C++核心语法入门:从命名空间到nullptr的全面解析

前言:终于到了C++章节,已经有点迫不及待了。今天我们来学习C++入门小知识。

1. 命名空间

1.1 namespace的价值

在C/C++中变量,函数名以及后面学习的类都是大量存在的,这些变量,函数名和类的名称都存在于全局作用域中,可能会导致很多冲突使用命名空间的目的就是为了解决命名冲突的问题。namespace是一个关键字

#include<stdio.h>#include<stdlib.h>int rand =20;intmain(){//重定义,rand是一个函数,包含在stdlib.h里printf("%d\n", rand);return0;}


我们本意是想要打印整型变量的,但在C++里不同,编译器会在局部域先进行查找,找不到再去全局域查找此时全局域有两个rand,一个是rand函数,一个是rand整型变量,这时就会发生报错。

1.2 namespace的定义

.定义命名空间,需要使用namespace关键字后面跟命名空间的名字,然后接一对{}即可。{}中即为命名空间的成员。命名空间中可以定义变量,函数,类型等

//解决了命名冲突的问题 namespace LC {int rand =20;structNode{int val;structNode* next;};}intmain(){//这里默认访问的是全局域里的rand函数指针printf("%p\n", rand);//指定了rand的出处,就会直接在LC命名空间里去查找printf("%d\n", LC::rand);return0;}

.namespace本质上是定义出了一个域,这个域跟全局域各自独立,不同的域可以定义同名变量

.C++中有局部域,全局域,命名空间域,类域域影响的是编译器语法查找变量/函数/类型出处的逻辑,所以有了域隔离,名字冲突的问题就解决了局部域和全局域除了会影响编译器的查找逻辑,还会影响变量的生命周期,命名空间域和类域不会影响变量的生命周期

.namespace只能定义在全局,也可以嵌套定义

intmain(){//命名空间不能定义在局部域 namespace LC {int a =10;intAdd(int left,int right){return left + right;}}return0;}
在这里插入图片描述

.项目工程中多文件中定义的同名namespace会认为是同一个namespace,不会发生冲突

.C++标准库都放在一个叫std(standard)的命名空间中

//命名空间的嵌套定义 namespace LC { namespace NSY {int rand =100;doubleAdd(double left,double right){return left + right;}}int a =10;intAdd(int left,int right){return left + right;}}intmain(){printf("%d\n", LC::a);printf("%d\n", LC::NSY::rand);printf("%d\n", LC::Add(2,4));printf("%.2f\n", LC::NSY::Add(2.2,4.4));return0;}

1.3 命名空间的使用

编译器在查找一个变量的声明或者定义时默认只会在局部域和全局域查找,不会到命名空间域里去查找

namespace LC {int a =10;intAdd(int left,int right){return left + right;}}intmain(){printf("%d\n", a);return0;}
在这里插入图片描述

所以,我们要使用命名空间里定义的变量和函数,有以下几种方式:

1.指定命名空间访问

2.using将命名空间中的某个成员展开

3.展开命名空间中全部成员

namespace LC {int a =10;double b =3.14;char ch ='a';}//展开命名空间部分成员 using LC::b;//展开命名空间全部成员 using namespace LC;intmain(){//指定命名空间访问printf("%d\n", LC::a);printf("%.2f\n", b);printf("%c\n", ch);return0;}

2. C++输入&输出

 1.<iostream>是Input Output Stream的缩写,是标准的输入,输出流 库,定义了标准的输入,输出对象。 2.std::cin是istream类的对象,它主要面向窄字符(narrow characters(of type char))的标准输入流。 3.std::cout是ostream类的对象,它主要面向窄字符的标准输出流。 4.std::endl是一个函数,流插入输出时,相当于一个换行字符加刷新缓冲区。 5.<<(流插入运算符),>>(流提取运算符),C语言中这两个运算符是位运算符。 6.C++的输入输出可以自动识别变量类型(本质上是通过函数重载实 现的),最重要的是C++的流能更好的支持自定义类型对象的输入输 出。 7.cout/cin/endl等都属于C++标准库,C++标准库都放在一个叫std (standard)的命名空间中,所以要通过命名空间的使用方式去用它 们。 8.using namespace std是将标准命名空间全部成员展开(一般在日常练习中使用) 
#include<iostream>intmain(){int a =10;double b =3.14;char ch ='c';//cout,cin是标准输入输出流的对象,属于C++标准库//不需要像C语言使用占位符来指定打印格式,cout,cin会自动识别类型 std::cout << a <<" "<< b <<" "<< ch << std::endl; std::cin >> a >> b >> ch; std::cout << a <<" "<< b <<" "<< ch << std::endl;return0;}
在这里插入图片描述
#include<iostream>//将std(标准命名空间)全部成员展开 using namespace std;intmain(){int a =10;double b =3.14;char ch ='c';//不需要在指定std cout << a <<" "<< b <<" "<< ch << endl; cin >> a >> b >> ch; cout << a <<" "<< b <<" "<< ch << endl;return0;}

3. 缺省参数

定义函数声明或函数定义时为函数参数指定一个缺省值

.在调用函数时,如果没有指定实参,则采用形参的缺省值,否则,使用指定的实参

在这里插入图片描述

.缺省参数分为全缺省和半缺省参数。(缺省参数也可以叫做默认参数)全缺省就是全部形参给缺省值半缺省就是部分形参给缺省值。C++规定,半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值

在这里插入图片描述

.带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参

在这里插入图片描述


在这里插入图片描述

.函数声明和定义分离时缺省参数不能在函数声明和函数定义中同时出现,C++规定,必须在函数声明的地方给缺省值

在这里插入图片描述


在这里插入图片描述

4. 函数重载

定义:C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数不同也可以是类型不同

.形参类型不同

在这里插入图片描述

.形参个数不同

在这里插入图片描述

.存在歧义问题

在这里插入图片描述


在这里插入图片描述

5. 引用

5.1 引用的概念和定义

概念引用不是新定义一个变量,而是对已存在的变量取别名编译器不会对引用变量开辟内存空间它和它引用的变量共用同一块空间

定义类型& 引用别名 = 引用对象

在这里插入图片描述


在这里插入图片描述

5.2 引用的特性

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

在这里插入图片描述


在这里插入图片描述

.引用一旦引用一个实体以后就不能在引用其它实体

在这里插入图片描述

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

在这里插入图片描述

5.3 引用的使用

引用在实践中主要用于引用传参和引用作返回值,可以减少拷贝提高效率,改变引用对象的同时可以改变被引用对象

在这里插入图片描述

这里传参只是传递了一个整型,拷贝并不会损失多少效率,但是如果是一个大对象呢?例如C中的结构体,拷贝就会付出很大的代价。这里暂时先了解这么多(不好举例)。

5.4 const引用

引用const对象必须用const引用,const引用也可以引用普通对象,因为对象的访问权限可以在引用过程中进行平移和缩小,但不能放大

intmain(){int a =10;//权限平移int& ra = a;//const引用也可以引用普通对象//权限缩小constint& rra = a;int b =20;// 2 * b是一个表达式, 2 * b的结果存在临时对象中// 临时对象具有常性,要常引用才可以//int& rb = 2 * b;//errconstint& rb =2* b;// b是int类型,rrb是double类型//存在类型转换的问题,b会转换成double类型存放在临时对象中//double& rrb = b;//errconstdouble& rrb = b;return0;}

临时对象就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象,C++把这个未命名对象叫做临时对象临时对象具有常性

6. 指针和引用的关系

.引用是给已存在的变量取别名,不开辟内存空间,指针存储变量的地址,要开空间

.引用一旦引用一个实体就不能再引用其它实体,指针可以不断的改变指向对象

.引用必须初始化,指针建议初始化

.引用可以直接访问指向对象,指针需要解引用才可以访问指向对象

.sizeof中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(与平台大小有关)

.指针容易出现空指针,野指针的问题;引用相对安全一些

7. inline函数

8. nullptr

NULL实际上是一个宏,在传统的C头文件(stddef.h)中,有如下代码:

在这里插入图片描述

.在C++中,NULL被定义为字面常量0,C中被定义为无类型指针(void*)的常量

.C++11中引入了nullptrnullptr是一个特殊的关键字nullptr是一种特殊类型的字面量它可以转换成任意其他类型的指针类型使用nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式的转换为指针类型,而不能被转换为整数类型

voidf(int x){ cout <<"f(int x)"<< endl;}voidf(int* ptr){ cout <<"f(int* ptr)"<< endl;}intmain(){//本意是调用f(int* ptr)函数,但由于NULL被定义成0,所以调用f(int x)函数f(NULL);//强转f((int*)NULL);//nullptr能被转换成任意类型的指针类型f(nullptr);return0;}

Read more

python通过调用海康SDK打开工业相机(全流程)

安装海康SDK 从海康威视官网下载对应的工业相机SDK(如MV-SDK),解压后运行安装程序。确保安装路径无中文或特殊字符。安装完成后,将SDK的lib目录添加到系统环境变量(如Windows的PATH),或直接复制*.dll文件到Python脚本同级目录。 配置Python依赖 安装Python与海康SDK交互的库,通常通过ctypes调用动态链接库。确保Python版本与SDK的位数一致(32/64位)。示例安装命令: pip install numpy opencv-python # 可选,用于图像处理 初始化SDK与设备 通过ctypes加载SDK动态库,并调用初始化函数。示例代码: import ctypes # 加载SDK库 sdk_lib = ctypes.cdll.LoadLibrary("MvCameraControl.dll") # 初始化设备 device_list = ctypes.c_void_p() sdk_lib.MV_CC_

By Ne0inhk
Python从0到100完整学习指南(必看导航)

Python从0到100完整学习指南(必看导航)

前言:零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学业升学和工作就业的先行者! 【优惠信息】 • 新专栏订阅前1000名享9.9元优惠 • 订阅量破1000后价格上涨至19.9元 • 订阅本专栏可免费加入粉丝福利群,享受: - 所有问题解答 - 专属福利领取 欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程! 本文目录: * 一、Python基础与编程入门(第1-15篇) * 1.环境搭建与语法基础 * 2.数据结构基础篇 * 3.函数编程篇 * 二、面向对象与文件处理(第16-24篇) * 1.面向对象编程篇 * 2.标准库与文件处理篇 * 三、并发编程与网络爬虫(第25-39篇) * 1.并发编程基础篇

By Ne0inhk
python从入门到实战:高阶实用技巧

python从入门到实战:高阶实用技巧

1、闭包 在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数成为闭包。我们看下面这段代码: account_amount = 0 def atm(num,deposit=True): global account_amount if deposit: account_amount += num print(f"存款:+{num},账户余额:{account_amount}") else: account_amount -= num print(f"取款:-{num},账户余额:{account_amount}") atm(300) atm(

By Ne0inhk
Python 高阶函数必学:map () 函数原理、实战与避坑指南

Python 高阶函数必学:map () 函数原理、实战与避坑指南

目录 * * @[TOC](目录) * 引言 * 一、map()函数的官方定义与核心作用 * 二、map()函数的完整语法(两种核心格式) * ✅ 语法格式1:处理单个可迭代对象【最常用】 * ✅ 语法格式2:处理多个可迭代对象【进阶用法】 * 三、基础实战案例:一个例子看懂运行全过程 * 案例1:基础用法 - 实现数字列表的翻倍处理 * 核心执行原理拆解(重中之重) * 案例2:进阶用法 - 处理多个可迭代对象 * 案例3:高阶简化 - 结合匿名函数lambda使用 * 案例4:常用场景 - 结合Python内置函数使用 * 四、map()函数的核心特性 & 重点注意事项(必看!避坑指南) * ✅ 注意事项1:Python3中map()的返回值不是列表!是迭代器!【高频坑】

By Ne0inhk