C++的初步认识

C++的初步认识,第1张

目录

一回顾C语言

1、C语言语法内容

2、C语言语法与C++语法的关系

二 bool类型

1、知识点介绍

2、注意

三 内联函数

1、知识点介绍

2、内联函数的定义

3、内联函数的特点

4、注:

四 函数重载

1、知识点介绍

2、构造函数重载的条件

 3、函数重载容易导致的二义性及解决

4、解决方法:

五 参数缺省 

 1、知识点介绍

1、知识点介绍

2、引用的定义

 3、引用的使用

4、引用的注意事项

5、引用不是定义新的变量或对象,因此不会为引用开辟新的空间内存 

5、指针和引用的区别

七 命名空间

1、知识点介绍:

2、命名空间的定义:

3、注意:

4、命名空间访问:

5、命名空间取别名:

6、命名空间成员的声明及定义:

八 cin和cout

1、知识点介绍

2、使用前准备

3、cin与cout

九 new和delete 

 1、知识点介绍

 2、new使用

3、new的特性


一回顾C语言 1、C语言语法内容

基本数据类型,运算符,表达式,语句

函数,数组,自定义数据类型

指针,预处理

2、C语言语法与C++语法的关系

二 bool类型 1、知识点介绍

1、bool是一种数据类型

2、取值为true(真)或false(假)

3、定义:bool iscollide=false;

4、内存大小占1字节 

2、注意

1、该类型的取值不仅仅只能用true或false,还是可以是一个数值,如果是一个数值,这个值 ,循环非0为真的原则。

三 内联函数 1、知识点介绍

1、内联函数是一个函数,是通过内存膨胀减少函数的跳转时间,以空间换时间。

2、内存膨胀:指的是代码区的代码变多,因为使用内联函数之后,那么这个函数的调用就不会在栈区申请 内存来运行,也就是少了入栈出栈的时间,如果是一个普通函数在调用的时候会有入栈和出栈。

2、内联函数的定义
inline int getNum()
{
    return 1;
}

定义一个内联函数也就是在定义函数的时候在返回值类型前面加上一个inline修饰函数

 

3、内联函数的特点

1、他是一个函数,调用与普通函数一致

2、通过内存膨胀来减少函数的跳转

3、函数体代码过长,或者函数体中有循环,不建议使用内联

4、函数体是简单的赋值语句或者返回语句,而且使用频率高,建议使用内联 

4、注:

内联函数在这里类似于宏替换,但是题目是有区别的,内联函数是一个函数,是在程序执行期间运行的,没有函数的入栈和出栈,宏替换是在预处理阶段执行的,本质是替换,内联函数有形参类型,有返回值类型和返回值,带参宏的形参是没有类型,没有返回值类型也没有返回值

四 函数重载 1、知识点介绍

1、函数重载指的是,在同一个项目中定义的函数名字可以重复,也就是可以有同名的函数,但是要有条件才能同名 

2、构造函数重载的条件

1、函数必须一致

2、函数的参数列表不同

函数的参数列表不同:

                                I、参数列表个数不同

                                II、相对应位置的类型不同

        注意:重载函数重载满足上述条件就可以了,函数的返回值不同不在条件内容 

1、以下这两个函数不满足函数重载,那么这样定义就会报错

int fun(){}
void fun(){}

2、以下这两个函数满足函数重载,参数列表个数不同,那么在调用的函数的就像函数调用一样,就比如有两个参的fun函数那么就是传2个参调用,要调用下面一个参的函数,就传一个对应的参,和函数调用一致的

void fun(int a,int b){}
void fun(int a){}
void fun(int a,double b,char c){}

3、以下这两个函数虽然参数个数一样,但是参数对应位置类型不同,也满足函数重载,在调用就传对应的参数调用就好了

void fun(int a,int b){}
void fun(float a,float b){}
 3、函数重载容易导致的二义性及解决
int fun(int a){}
int fun(float a){}

从函数重载的重载条件来看,构成重载,编译不会有问题,但在调用时,如果调用方式如:fun(2.3);这样由于函数的实参为double,而该函数并无该类型的重载,在编译时会自动将double类型强转去匹配函数,这时double可以强转为int,也可以强转为float,这样就会出现二义性的问题。 

4、解决方法:

1、加入新的重载函数 int fun(double a){}

2、明确调用时实参强转类型如:fun((int)2.3);或者传一个不会进行转换的参数进去

注:编译器总是会帮助我们把基本数据类型大端转为小的(高精确度===》低精确度) 

五 参数缺省   1、知识点介绍

1、顾名思义,在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用默认值,就无须指定该参数。

2、函数的缺省参数定义

函数参数的缺省定义:

void fun(int a,int b=2){}

函数调用:

fun(1);

fun(1.3);

这个函数的形参有缺省的值了,那么就可以不用给它传参了,不给它传参,那么形参用的值就是这里默认的值,如果是传参了,就是用的传参了的值 

 3、函数的缺省参数注意事项

1、缺省参数只能由后往前依次缺省

2、缺省值必须是常量

3、函数如果只有定义,需在定义的参数列表中指明缺省参数。如果函数有声明和定义,则缺省参数只需在声明只指明即可

void myFun(int a,int b=0);
void myFun(int a,int b){}

4、函数的缺省参数与函数重载产生的二义性,及解决方法

int myAdd(int a,int b,int c = 0);
int myAdd(int a,int b);
// 分析:
上述两个函数满足函数重载,编译可通过,在调用第2个函数时就会出现二义性问题。也就是第1个函数也
是满足调用条件,第2个函数同样满足。只有调用myAdd函数并且给出3个实参才不会出现二义性。
// 解决办法:
1 把第1个函数的缺省参数去掉
2 不实现函数重载

六 引用

1、知识点介绍

1、引用是对一个变量或者对象取的别名

2、引用的定义
既然是对一个变量或者对象取别名,那就先得有变量或者对象,不能凭空取一个别名也就是定义引用必须
初始化

int gameControllerNum=10;
定义别名的方式: 真名的类型 & 别名 = 真名; //别名也要是合法标识符

int & gcn=gameControllerNum;

gcm是gameControllerNum的别名,那么我们就可以用这个别名,用这个别名就相当于是在用真名,对别
名修改同时别名所对应的真名的值也会改变。

gcn=20;
那么相对于的gameControllerNum的值也会别改成20
 3、引用的使用

1、要看你引用的是什么类型的变量,如果是引用的整形变量那么就这个引用就像一个整形变量使用,如果引用的是一个指针就引用就像指针一样使用,是结构体变量,就像结构体变量一样使用

4、引用的注意事项

1、引用是别名,所以定义引用的时候别名需要初始化

2、对引用的 *** 作和对引用对应的变量的 *** 作是完全等价的

3、&在引用这里不是取地址,而是起到标志的作用

4、引用的类型必须和其所对应的变量的类型相同

5、引用不是定义新的变量或对象,因此不会为引用开辟新的空间内存 
5、指针和引用的区别

在效率上是没有多大区别的

1、引用是别名,不会被分配空间。指针是实体,会被分配空间

2、引用在定义时必须初始化,而且不是被改变,指针定义时可以不用初始化,也可以改变值

3、指针有多级指针,但是没有多级引用

4、引用是直接访问,指针是间接访问 

七 命名空间 1、知识点介绍:

1、命名空间是用来组织和重用代码的编译单元

2、在编写代码时写的程序不可能所以的标识符都没有重名现象,在多个协同开发时更加不可控,尤其对于库来说问题更加严重。为了解决重名现象,通过命名空间来避免冲突。

2、命名空间的定义:
namespace 命名空间标识符
{
 ...命名空间成员
}

花括号只有两种情况:

1、定义域(必须加分号);

2、作用域(可加可不加) 

3、注意:

1、命名空间标识符必须满足标识符的命名规则和命名规范,习惯名字唯一,通常以开发团队的名字(项目名)来命名

2、命名空间可以在全局,也可以在局部(命名空间接受嵌套定义),但不能在函数内和类中定义

3、命名空间的花括号是作用域

4、注意命名污染,尽量规避同名的出现,如果两个命名空间同名,那么就会合并两个命名空间 

4、命名空间访问:

作用域运算符 ::

可以理解为,           什么的什么          ::就是那里的 

1、using 声明: using 命名空间名称::空间成员名称;
放开一个成员的可见性,这一个成员可以在空间外可见(建议大家使用这种,比较容易避免出现命名污染)
2、using 指示: using namespace 命名空间名;
放开该命名空间的所有权限(所有成员都在空间外可见),适用于该空间的大部分成员都需要经常被使用
3、命名空间名称::空间成员名称,直接访问空间下的某一个成员
5、命名空间取别名:

1、namespace 别名=命名空间名

2、当命名空间标识符过长或不太方便记忆,可通过取别名的方式来表示该命名空间,别名的 *** 作等价于原命名空间 

6、命名空间成员的声明及定义:
namespace A
{
    void fun();
}
声明


void A::fun()
{
    函数功能;
}
命名空间外实现
八 cin和cout 1、知识点介绍

cin的作用和scanf一样

cout的作用和printf一样

他们在是具体使用的时候有些区别,C++不需要记格式占位符 

2、使用前准备

1、需要包含头文件         

2、需要声明命名空间 std中的权限

3、C++的头文件,不带  .h,如果你要包含C语言的头文件正常写.

C++兼容C.或者#include

3、cin与cout
示例:
int x,y,z;
cin>>x>>y>>z;//从键盘对xyz赋值 输入的时候每个值中间用空格隔开
cout<
九 new和delete   1、知识点介绍

1、在C++中用来向系统申请堆区的内容空间,

new等价于C语言中的malloc,

delete等价于C语言中的free

 2、new使用
1、申请单个内存

int *p=new int

2、申请单个内存初始化
int *p=new int(10);

3、申请多个连续的空间
int *p=new int[10];
3、new的特性

1、new是关键字

2、new可以分配两种内存,一种单个内存,一种是连续的内存

3、new只有分配单个内存的时候可以同时给该内存赋值,分配连续多个内存是无法同时赋值的

4、如果要给连续的内存同时赋值用memset赋值,赋值为0 

4、delete使用

1、释放单个内存
delete p;
p=NULL;

2、释放连续内存
delete []p;
p=NULL;

5、delete的特性

1、delete是运算符

2、delete可以释放两种内存,一种是单个内存,一种是连续内存

3、delete释放内存时,指针的必须是指向内存首地址

4、释放完内存之后要记得给指针赋值NULL *** 作,不要产生野指针 

6、动态内存 *** 作中常见的问题

1、没有给指针分配内存,就对该指针解引用赋值

int *p;
*p=10;

 2、给指针分配内存成功,但是没有初始化就使用了

int*p=new int;
printf("%d\n",*p);

3、内存分配成功,也初始化了但是 *** 作越界

int *p=new int[5];
*(p+7)=123;

这种 *** 作通常情况下,因该都可以正常执行,但是这样很有大的问题,因为你不知道越界到的地方是否有在使用的数据,如果有那么这种越界 *** 作就会改变哪里的数据,出现一些问题

4、忘记释放内存,造成内存泄漏

有申请内存那么就要记得使用完之后释放内存,如果不释放可以用的堆区内存就会变少

5、释放内存之后,继续使用

int *p=new int;
*p=10;
delete p;
*p=20;

 

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/875555.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)