c++随笔——17.10.21(一)

本文介绍了C++中的几种高级编程技巧,包括内联函数、重载函数和模板函数的使用方法,以及指针数组、数组指针和函数指针的区别与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学自Essential c++

 

内联函数inline

它的作用是以达到程序效率的较优化。定义为inline的函数,它一般为较为简单,

经常使用的函数,它提供一个请求,询问编译器是否把inline函数展开,以达到

运行效率较优的结果。也即是,它是非强制性的。

 

重载函数

函数名可以相同,但是函数的参数必须不同,否则会报错。这就提供了一个很好的

“兼容性”,可以同一个名字处理不同类型的数据。

 

模板函数

感觉和重载差不多?

也是针对不同的变量类型,但是在定义的时候代码的传参类型的变量或者内建型参数还是未知的。只有在调用的时候才给予确定的变量,而这个变量的是什么类型的,都是可以的,但是一旦确定,里面相同“名字”的变量都是一样的类型。例如:

Template<typename elmes>

Void chat(const elmes val)

{

Elems num; //numval的类型是相同的

Num = val;

}

 

Template<typename el1,typename el2>

Void chat(el1 va1,el2 va2 ) //此时va1va2可以是不同类型的变量

{

...

}

模板函数也可以建立重载。

Template<tyname elem>

Void chat(char ch,vector<elem>)

{

...

}

Void chat(char ch,list<elem>)

{

...

}

补充:

使用模板的时候,参数应为“变量”,也就是显性地声明了类型的量,例如:

    string *num;

    string q = "!";

    int a[]={1,2,3,4,5};

    string s[]={"hello","world","!"};

    vector<int> e(a,a+3);

    num = find(e,1); //error

Find中的两个参数为模板,不能直接使用1,应使用 const int one_1 = 1;这样带进去。

指针数组和数组指针

1. 指针数组

Int *ptr[]; //这就是一个指针数组,[]的优先级高于*,所以先执行(ptr[]),有了一个数组ptr,然后里面的所有元素都是指针,即这个数组内的元素都是指针,a[0]---->指针。

2. 数组指针

Int (*ptr)[]; //这就是一个数组指针,由于()更改了优先级,先执行了*,所以ptr是指针,再执行[],则这个指针有多大的长度呢,这就说明了。数组指针一般作为行指针使用。

例如:

A[3][4]; //一个二维数组,三行四列

Int (*ptr)[4]; //长度为四的数组指针

Cout<<*ptr; //输出为*a[0]

Cout<<*(ptr+1);//输出为*a[1]

//也就是说,它加1就掠过了中间的长度,读到了下一行的数组,所以亦称为行指针。

 

总的来说,指针数组有多个指针,而数组指针有一个指针。

 

函数指针

顾名思义就是指向函数的指针。

格式:

函数返回类型 *ptr (函数参数类型); //注意要让ptr是指针的优先级高一下

函数返回类型 (*ptr) (函数参数类型);

然后再让 ptr = 所要调用的函数名; /再调用此指针就会寻址到该函数执行了

 

一般这么使用,定义一个指针数组指向一些函数,这样使用的时候就可以通过“数字”来任意转换所想要调用的函数了。例如:

Const int (*addr[]) (int) = {

Chat,display,showNum,...,}; //定义了一组返回为int,输入为int型的指针数组。

//可以通过addr[0..n]的选择来选择想要调用的函数。

//ptr = addr[0]; //调用chat函数,ptr = addr[1];//调用display函数

 

还可以使用枚举类型

Enum {

Echar,

Edisplay,

Eshownum,

};

//注意里面只是一些名称而已,目的是为了帮助我们记忆

//根据枚举的作用,如果没有特别的声明,则按顺序从0递增

//echar=0,edisplay=1,eshownum=2;

//这样再使用语句,ptr = addr[echar];我们就可以很清楚地知道寻址的是char这个函数。

 

 

声明与定义

声明和定义的界定应该是以分配内存来定的吧。

广义上说的话,

声明有定义性的声明,例如:int a;//没有赋初值,但是已经分配空间

Int a =0; //分配空间,赋初值

引用性的声明,例如:extern int a;//告诉编译器,我已经在别处定义过了,去别处找吧,没有再分配空间

只是变量的,比较复杂,因为你在不同的作用域,同名变量也是不同的。涉及到了作用域,所以你声明或定义了一个变量,也就为其分配了空间。而函数一般写在全局上,或者头文件中,所以,有函数体就是定义了,没有就是声明的。

Extern static 的分析:

http://www.cnblogs.com/dolphin0520/archive/2011/04/20/2022701.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值