C++在非面向对象方面的扩充

1.注释行

在C++中,可以用"/*"和"*/"作为注释分界符号。如:

/* This is a test.*/

还可以用//来进行注释,如:

//This is a test.

"/*~~~~~~*/"表示方式不能嵌套,却可以在里面嵌套"//"的方式做注释。

2.输入和输出

cin表示输入,cout表示输出。如:

cin>>a;                         //输入a

cout<<a;                      //输出a

用cin和cout进行I/O操作时,在程序中必须嵌入头文件iostream

用cout输出时可以输出不同进制的数据。如:

dec把转换基数设置为十进制,hex把转换基数设置为十六进制,oct把转换基数设置为八进制

3.const修饰符

 C++中可以用const修饰符来定义常量。如:

const int S=100;

const作用与#define相似,但他消除了#define的不安全性

#define的不安全性为:

#include <iostream>
using namespace std;
int main()
{int a = 1;
#define T1 a + a
#define T2 T1 - T1cout << "T2 is " << T2 << endl;return 0;
}

初看程序,似乎应得出结果为:

T2 is 0

但实际输出结果为

T2 is 2

其原因是C++把第7行语句解释为:
cout<<"T2 is "<<a+a-a+a<<endl;

而使用const修饰符则没错误。如:

#include <iostream>
using namespace std;
int main()
{int a = 1;int const T1 = a + a;int const T2 = T1 - T1;cout << "T2 is " << T2 << endl;return 0;
}

运行结果为 

T2 is 0

const也可以与指针一起使用,有三种方式:指向常量的指针,常指针, 和指向常量的常指针

(1)指向常量的指针是指一个指向常量的指针变量如:
const char * name="chen";         //声明指向常量的指针

这个语句的含义为:声明一个名为name的指针变量,它指向一个字符型常量,初始化name为指向字符串“chen”

const不允许改变指针所指地址中的常量,所以下面的语句是错误的:

name[3]='a';                              //错误,不允许改变指针所指的变量 

但是,由于name是一个指向常量的普通指针变量,不是常指针,因此可以改变name所指的地址。如:

name="chang";                                        //合法,可以改变指针所指的地址

该语句就赋给了指针另一个字符串的地址,即改变了name的值。

(2)常指针是指把指针所指的地址,而不是它指向的对象声明为常量。如:
char * const name="chen";                      //常指针

这个语句的含义为:声明一个名为name的指针变量,该指针是指向字符型数据的常指针,用“chen”的地址初始化该常指针

常指针=不能移动的固定指针,即不能改变指针所指的地址,但他所指地址中的数据可以改变。如:

name[3]='a';                                 //合法,可以改变指针所指的数据         

name="chang";                            //错误,不能改变指针所指的地址

(3)指向常量的常指针是指这个指针本身不能改变,它所指向的地址中的数据也不能改变。如:

const char * const name="chen";

这个语句的含义是:声明了一个名为name的指针变量,他是一个指向字符型常量的常指针,用“chen”的地址初始化该指针。下面的例子都是错误的:

name[3]='a';                            //错误,不能改变指针所指地址中的数据

name="chang";                       //错误,不能改变指针所指的地址

①如果用const定义的是整型常量,关键字int可以省略。

函数的形参也可以用从const声明,用于保证形参在该函数内部不能改动

4.内联函数

在函数说明之前冠以关键字"inline",该函数就被声明为内联函数,又称内置函数。

目的是为了消除函数调用时的系统开销,以提高运行速度

本质代码插入

说明
(1)在内联函数中一般不能含有复杂的控制语句,如for语句和switch语句等。

(2)通常只有规模很小(一般为1~5条语句)而使用频繁的函数才定义为内联函数。

5.函数的重载

在C++中,允许两个或两个以上的函数共用一个函数名。

当两个或两个以上的函数共用一个函数名时,称为函数重载。被重载的函数称为重载函数

重载函数应在函数参数的类型不同,或者参数的个数不同,或者两者兼有之

代码如下:

#include <iostream>
using namespace std;
int square(int i)
{return i * i;
}
long square(long l)
{return l * l;
}
double square(double d)
{return d * d;
}
int main()
{int i = 12;long l = 1234;double d = 5.67;cout << i << '*' << i << '=' << square(i) << endl;cout << l << '*' << l << '=' << square(l) << endl;cout << d << '*' << d << '=' << square(d) << endl;return 0;
}

运行结果为:

12*12=144
1234*1234=1522756
5.67*5.67=32.1489

说明:
(1)如果两个函数的参数个数和类型都相同,而只有返回值类型不同,则不允许重载。虽然两个函数的返回值类型不同,但是由于参数类型和个数完全相同,系统无法从函数的调用形式上判断那一个函数与之匹配。

(2)函数的重载与带默认值的函数一起使用时,有可能引起二义性。如:

void Drawcircle(int r=0,int x=0,int y=0);

coid Drawcircle(int r);

当执行以下函数调用时

Drawcircle(20);

无法确定是哪一个函数。

(3)在函数调用时,如果给出的实参和形参的类型不相符,C++编译器会自动地做类型转换工作。若转换成功,则继续执行,否则出现错误。如:

void a(int x);

void a(long x);

如果用下面数据去调用,就会出现不可分辨的错误。

int c=a(5.56);

编译器无法确定将5.56转化为int类型还是long类型。

注:类型转换

C语言类型转换分级别,一般多是:

默认状态:低级向高级转换,级别高低(小到大):int,float,double,(注意char只可以和int之间转换);

若要高级向低级转换:就要用到强制类型转换符!如int(7.7)=7;

6.带有默认参数的函数

C++在说明函数原型时,可为参数指定默认参数值,以后调用此函数时,若省略其中某一参数,C++自动地以默认值作为相应参数的值。

函数原型说明为:

int special(int x=5,float y=5.3);

以下的函数调用都是允许的:

special( ); // x=5, y=5.3

special(25); // x=25, y=5.3

special(100,79.8); // x=100,y=79.8

(1)在声明函数时,所有指定默认值的参数都必须出现在不指定默认值的参数的右边,否则出错

例如:

int fun(int i, int j=5, int k);   ×

可改为:

int fun(int i, int k, int j=5);

2) 在函数调用时,若某个参数省略,则其后的参数皆应省略而采用默认值。不允许某个参数省略后,再给其后的参数指定参数值

例如不允许出现以下调用:

special( , 21,5);   ×

(3)在函数原型中默认参数可以不包含参数的名字

如:

#include<iostream>    using namespace std; void write( int =5);void main( ){ write( ); }void write(int a){ cout<<a; }

 7.作用域运算符

如果用两个同名变量,一个是全局的,一个是局部的,那么局部变量在起作用域内具有较高的优先权,他将屏蔽全局变量

#include<iostream>    using namespace std;int avar=10;       //全局变量avar int main( ){ int avar;	 avar=25;          //局部变量avar cout<<"local avar ="<<avar<<endl;cout<<"global avar ="<<::avar<<endl;return 0;}

程序运行结果如下:

local avar=25

global avar=10 

如果希望在局部变量的作用域内使用同名的全局变量,可以在该变量前加上"::",此时::avar代表全局变量avar,"::"称为作用域运算符

8.无名联合

无名联合是C++中的一种特殊联合,它在关键字union后面没有给出联合名,它可使一组数据项共享同一内存地址。

9.强制类型转换

C语言中,如果要把一个整型数(int)转换为双精度型数(double),可以使用以下形式:

int i=10;

double x=(double) i;

在C++中,还有提供了另一种格式:

int i=10;

double x=double (i);

10.运算符new和delete

(1)

运算符new用于内存分配的最基本形式为:

指针变量名=new 类型;

如:

int *p;

p=new int;

运算符delete用于释放运算符new分配的空间。基本形式为:
delete 指针变量名;

如:

delete p;

(2)new可在为简单变量分配内存的同时,进行初始化,基本形式为:

指针变量名=new 类型(初值);

如:

int *p;

p=new int(99);                       //动态分配空间,并将99作为初始值赋给它

使用new可以为数组动态分配内存空间,这时需要在类型名后面缀上数组大小。 如:

char* p=new char[10];

int* op=new int[5][4];

但是,new不能对动态分配的数组存储区进行初始化。

(3)释放动态分配的数组存储区时,可用以下形式:

delete []指针变量名;

(4)使用new动态分配内存时,如果没有足够的内存满足分配要求,则动态分配空间失败,有些编译系统会返回空指针NULL,因此可以对内存的动态分配是否成功进行检查

代码如下:

#include<iostream> 
using namespace std; 
int main()
{ int *p;p=new int;if (!p){cout <<"allocation failure\n";return 1;}*p=20;cout<<*p;delete p;return 0;
}

若动态分配内存成功,将在屏幕上显示: 20;

若动态分配内存失败,将在屏幕上显示: allocation failure.

11.引用

1.

建立引用的作用是为变量另起一个名字,变量的引用通常被认为是变量的别名。 声明一个引用的格式如下:

类型 &引用名=已定义变量名;

例如:

int i=5;

int &j = i;

这里,声明了一个整数类型的引用j ,用整型变量i对它进行初始化,这时j就可看做是变量i的引用,即是变量i的别名。也就是说,变量i和引用j占用内存的同一位置。当i变化时,j也随之变化,反之亦然

说明:

(1)对变量声明一个引用,编译系统不给它单独分配存储单元,i和j都代表同一变量单元。

(2)在声明一个引用时,必须立即对它进行初始化,即声明它代表哪一个变量。不能声明完成后再赋值

例如下述声明是错误的。

 int i;

int &j;                              //错误

j=i;

(3) 为引用提供的初始值,可以是一个变量或另一个引用。如:

int i=5;                       //定义整型变量

i int &j1=i;                 //声明j1是整型变量i的引用(别名)

int &j2=j1;                  //声明j2是整型引用j1的引用(别名)

这样定义后,变量i有两个别名:j1和j2。

(4) 指针是通过地址间接访问某个变量,需要书写间接运算符“*”; 引用是通过别名直接访问某个变量。

每次使用引用时,可以不用书写间接运算符“*”,因而使用引用可以简化程序

(5) 引用在初始化后不能再被重新声明为另一个变量的引用(别名)

(6) 尽管引用运算符“&”与地址操作符“&”使用相同的符号,但是它们是不一样的。

引用运算符“&”仅在声明引用时使用。

其他场合使用的“&”都是地址操作符。

例如:

int j=5;

int& i=j;                    //声明引用i,“&”为引用运算符

i=123;                      //使用引用i,不带引用运算符

int *pi=&i;                // 在此,“&”为地址操作符 

cout<<&pi;              //在此,“&”为地址操作符 

2. 引用作为函数参数

① 用变量做函数参数:传值调用

代码如下:

#include <iostream>
using namespace std;
void swap(int m, int n)
{int temp;temp = m;m = n;n = temp;
}
int main()
{int a = 5, b = 10;cout << "a=" << a << "b=" << b << endl;swap(a, b);cout << "a=" << a << "b=" << b << endl;return 0;
}

② 用指针做函数参数:传址调用

代码如下:

#include <iostream>
using namespace std;
void swap(int *m, int *n)
{int temp;temp = *m;*m = *n;*n = temp;
}
int main()
{int a = 5, b = 10;cout << "a=" << a << "b=" << b << endl;swap(&a,&b);cout << "a=" << a << "b=" << b << endl;return 0;
}

③ 用引用做函数参数:传址调用

代码如下:

#include <iostream>
using namespace std;
void swap(int &m, int &n)
{int temp;temp = m;m = n;n = temp;
}
int main()
{int a = 5, b = 10;cout << "a=" << a << "b=" << b << endl;swap(a,b);cout << "a=" << a << "b=" << b << endl;return 0;
}

注意三者的调用方法

3. 使用引用返回函数值

使用引用可以返回函数的值,采用这种方法可以将该函数调用放在赋值运算符的左边。

代码如下:

#include<iostream>
using namespace std;int a[ ]={1,3,5,7,9};int& index(int i)               //定义函数返回一个int类型的引用,等价于返回数组元素a[i] { return a[i] ;}int main(){cout<<index(2)<<endl;index(2)=25;                  //将函数调用放在赋值运算符的左边, 等价于将a[2]赋值为25 cout<<index(2);return 0;         }

说明

1.可以建立指针变量的引用,如:

int i=5;                 //定义整型变量i,初值为5

int *p=&i;             //定义指针变量p,指向i

int* &pt=p;           //pt是一个指向整型变量的指针变量p的引用

如果输出*pt值,就是*p的值5。

2.可以用const对引用加以限定,不允许改变该引用的值

例如:

int i=5; const int &a=i;           //声明常引用,不允许改变引用a的值

a=3;                                       //错误,企图改变引用a的值

但是这个引用所代表的变量的值可以改变

例如:

i=3; 此时输出的i和a的值都是3。

这一特性在用作函数形参,保护形参值不被改变时很有用的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s 如何获取加入节点命名

当k8s集群初始化成功的时候&#xff0c;就会出现 加入节点 的命令如下&#xff1a; 但是如果忘记了就需要找回这条命令了。 kubeadm join 的命令格式如下&#xff1a;kubeadm join --token <token> --discovery-token-ca-cert-hash sha256:<hash>--token 令牌--…

虚拟机-从头配置Ubuntu18.04(包括anaconda,cuda,cudnn,pycharm,ros,vscode)

最好先安装anaconda后cuda和cudnn&#xff0c;因为配置环境的时候可能conda会覆盖cuda的路径&#xff08;不确定这种说法对不对&#xff0c;这里只是给大家的建议&#xff09; 准备工作&#xff1a; 1.Ubuntu18.04&#xff0c;x86_64&#xff0c;amd64 虚拟机下载和虚拟机Ubu…

[密码学] 密码学基础

目录 一 为什么要加密? 二 常见的密码算法 三 密钥 四 密码学常识 五 密码信息威胁 六 凯撒密码 一 为什么要加密? 在互联网的通信中&#xff0c;数据是通过很多计算机或者通信设备相互转发&#xff0c;才能够到达目的地,所以在这个转发的过程中&#xff0c;如果通信包…

康耐视visionpro-CogToolBlock工具详细说明

CogToolBlock功能: 将多个工具组合在一起完成某个功能&#xff0c;接口简单且可以重用 CogToolBlock操作说明&#xff1a; 1.打开工具栏&#xff0c;双击或点击鼠标拖拽添加CogToolBlock CogToolBlock操作说明 ②.添加输入图像&#xff0c;右键“链接到”或以连线拖拽的方式选…

Games104 听后笔记

1、为什么UE5要自己写一套STL库 因为传统的STL库中&#xff0c;例如&#xff1a;vector&#xff0c;它一般采用的是双倍扩容法&#xff0c;加入1000个数据装满了&#xff0c;现在需要又加一个&#xff0c;那么就开辟了2000个数据的空间&#xff0c;那么当前就又999的数据空间暂…

Python爬虫:爬虫常用伪装手段

目录 前言 一、设置User-Agent 二、设置Referer 三、使用代理IP 四、限制请求频率 总结 前言 随着互联网的快速发展&#xff0c;爬虫技术在网络数据采集方面发挥着重要的作用。然而&#xff0c;由于爬虫的使用可能会对被爬取的网站造成一定的压力&#xff0c;因此&#…

UE RPC 外网联机(1)

技术&#xff1a;RPC TCP通信 设计&#xff1a;大厅服务<---TCP--->房间服务<---RPC--->客户端&#xff08;Creator / Participator&#xff09; 1. PlayerController 用于RPC通信控制 2.GameMode 用于数据同步 3.类图 4. 注意 &#xff08;1&#xff09;RPC&a…

记录一次数组越界导致的线程死锁问题

1. 问题描述 在一次代码调试的过程中&#xff0c;遇到过一个问题&#xff0c;线程在调用pthread_cancel时&#xff0c;提示未找到目标线程&#xff0c;然后程序阻塞在了与目标线程相关的条件变量的释放上&#xff0c;造成了死锁的现象。 2. 问题复现 #include <pthread.h…

微机原理与接口技术-精选复习题

1、ADC0809的START和EOC引脚的功能是什么&#xff1f;在查询方式和中断方式中&#xff0c;EOC引脚分别如何处理&#xff1f; START是转换启动信号&#xff0c;EOC信号是转换结束信号。在查询方式中&#xff0c;EOC可作为状态信息输入至CPU以供查询&#xff1b;在中断方式中EOC…

python--初学函数

函数&#xff08;function&#xff09;&#xff1a; 什么是函数&#xff1f; 具有名称的&#xff0c;是为了解决某一问题&#xff0c;功能代码的集合&#xff0c;叫做函数 python中函数如何定义&#xff1a;def>define function定义函数 def function_name([args临时变量…

JavaScript 常用方法(1):JS日期格式化函数、JS实现并列排序、JS实现数字每三位添加逗号、JS 实现根据日期和时间进行排序

1、JS日期格式化函数 JS日期格式化转换方法 /*** description 格式化时间* param fmt 格式 如&#xff1a;yyyy-MM-dd、yyyy-MM-dd HH:mm:ss、yyyy年MM月dd日 W HH:mm:ss等* param {String} date 时间戳* returns {string|null}* 对 Date 的扩展&#xff0c;将 Date 转化为指…

如何在CentOS使用Docker搭建MinIO容器并实现无公网ip远程访问本地服务

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…

拥有超小型领先工艺射频微波电子元器件厂商兆讯授权世强硬创代理

射频前端芯片在模拟芯片中&#xff0c;属于进入门槛较高、设计难度较大的细分领域&#xff0c;由于国内射频前端芯片行业起步较晚&#xff0c;其市场份额主要被外企所占据&#xff0c;而在国产化浪潮的推动下&#xff0c;上游厂商的射频前端产品及技术逐渐具备领先的竞争优势。…

【C++初阶】之类和对象(下)

【C初阶】之类和对象&#xff08;下&#xff09; ✍ 再谈构造函数&#x1f3c4; 初始化列表的引入&#x1f498; 初始化列表的语法&#x1f498; 初始化列表初始化元素的顺序 &#x1f3c4; explicit关键字 ✍ Static成员&#x1f3c4; C语言中的静态变量&#x1f3c4; C中的静…

Leveled mode of TFHE

参考文献&#xff1a; [CGGI16] Chillotti I, Gama N, Georgieva M, et al. Faster fully homomorphic encryption: Bootstrapping in less than 0.1 seconds[C]//Advances in Cryptology–ASIACRYPT 2016: 22nd International Conference on the Theory and Application of C…

蓝桥杯嵌入式学习笔记(6):IIC程序设计

目录 前言 1. IIC基本原理 2. 电路原理 3. 代码编程 3.1 预备工作 3.2 AT24C02写读功能编写 3.2.1 AT24C02写操作实现 3.2.2 AT24C02读操作实现 3.3 MCP4017写读功能编写 3.3.1 MCP4017写操作实现 3.3.2 MCP4017读操作实现 3.4 main.c编写 3.4.1 头文件引用 3.4.…

蓝桥杯每日一题(floyd算法)

4074 铁路与公路 如果两个城市之间有铁路t11&#xff0c;公路就会t2>1,没铁路的时候t1>1,公路t21。也就是公路铁路永远都不会相等。我们只需要计算通过公路和铁路从1到n最大的那个即可。 floyd是直接在数组上更新距离。不需要新建dis数组。另外一定要记得把邻接矩阵初始…

【数据结构】链表习题之环形链表的约瑟夫问题

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《数据结构》 &#x1f389;道阻且长&#xff0c;行则将至 前言 今天这道题目时牛客上的题目&#xff0c;名为环形链表的约瑟夫问题&#xff0c;很有趣的的一道题目 环形链表的约瑟…

SpringBoot在线电影订票系统实战开发教程及源码之手把手教你做一个在线电影订票系统(带参考论文)

今天发布的是一款基于SpringBoot脚手架开发的在线电影订票系统实战开发教程和完整源码&#xff0c;这里强调一下&#xff1a;本系统基于springboot脚手架开发&#xff0c;如果还没学习脚手架的话先去学习脚手架&#xff0c;不然学不懂这个电影订票系统哦&#xff0c;重要的事说…

2024河北石家庄矿业矿山展览会|河北智慧矿山展会|河北矿博会

2024中国&#xff08;石家庄&#xff09;国际矿业博览会      时间&#xff1a;2024年7月4-6日 地点&#xff1a;石家庄国际会展中心.正定      随着全球经济的持续增长和矿产资源需求的不断攀升&#xff0c;矿业行业正迎来前所未有的发展机遇。作为矿业领域的盛会&…