c++ Primer 的一点基础记录(5)–面向对象设计

这部分开始算比较关键的部分了。设计函数,函数指针等重要内容。

1,int gc(int ,int )这个是函数声明,也叫函数原型,没有参数名称的哦。

2,关于参数传递的方式和影响

c++默认的传递方式安置传递:

如int a(int b,int c);这种调用下,被传入的参数是经过一次复制的,也就是说并不是原本的实参。这样做的结果会造成b和c的值永远只会在函数体内变化,但是变化的就结果无法影响到实参。

你可以有2个方法来处理这个情况,也就是让函数体内的值变化,反映到实参。

//1.用const,int a(const int b,const int c);当然这个方式必须保证传入的参数也是const的。

2,使用指针,int a(int b,intc);当然这个方式必须保证传入的参数是地址了,a(&b,&c);

3,使用引用,int a(int &b,int &c); 当然这个方式的调用要这样 a(b,c);

这样你在函数体内的值变化,就能反映到外界了。

3,什么时候使用引用参数?

a,值交换

b, 主调函数返回额外结果

c,向函数传递大型对象

4,如果希望以引用参数来避免拷贝被用作实参的大型对象,又希望防止函数修改实参的值,如果引用参数不希望在被调用的函数内部被修改(也就是说,函数内部的操作不会影响实参的话),那么把参数声明称const的引用。

如: c++ Primer 的一点基础记录(5)--面向对象设计c++ Primer 的一点基础记录(5)--面向对象设计代码1classX;

2externintfoo_bar(X&);

3

4intfoo(constX&xx)

5{

6returnfoo_bar(xx);//错误 const传递给了非const

7}

8

9修改

10externintfoo_bar(constX&);

11externintfoo_bar(X);//值传递

12

13或者可以传递一个xx的拷贝做实参

14intfoo(constX&xx)

15{

16X x2=xx;//拷贝值

17

18returnfoo_bar(x2);

19}

20

5,如果一个参数可能在函数中指向不同的对象,或者不指向任何对象,则必须使用指针。

6,const参数的引用,未必要求const的实参。(待验证)

7,c++中数组都是以指针方式传递。且长度与参数声明无关

void aap(int) void aap(int []) void app(int[10])都一样,都被编译器转化成 void aap(int)

因为数组用指针传递所以有2点需要注意:

a,指针传递意味着对参数的修改会直接反映到实参。如果实参不能被修改,即需要保持不变,那么 函数可以通过把参数类型声明加上const

1voidputValues(constint[10]);

b,由于数组长度不是参数类型的一部分,所以编译器不检查这个部分。建议可以传递一个长度参数进去。

1voidputValues(int[10],intsize);

如何让编译器去检测函数参数和实参的数组长度是否一致呢?

使用引用数组作为函数参数

void putValue(int (&arr)[10]);这时候编译器就会去检测调用函数时,数组长度是否一致。

8,函数模板是一种“让代码在广泛的不同参数类型上不变”的一种机制。

1template<classType>2voidputValues(Type*ia,intsz)

3{

4

5}

6//Type 是参数名,class代表模板参数类型。在putValues的参数中,Type是实际类型占位符。

7//实例化时Type将被实际类型代替

9,对于多维数组必须声明第一维以外的所有维数的长度。

10,当一个函数没有改变传入参数的值时,可以使用const类型的参数引用较为适合。

11, c++在默认情况下返回的值按照值传递的,也就是说return的时候需要copy一份数据。而对于大数据则很耗时,所以也可以指定引用和指针作为返回类型。

Mx& add(Mx p1 ,Mxp2){}

但是也要注意返回引用的时候如果返回了在函数内部的参数值,则发生生命周期实效后,值指向了一个为定义的内存区的问题。你可以实现copy出去,或者改变返回的类型。

12,如果不希望在引用参数作为函数参数时,内部的修改改变实参的,可以让函数返回const类型。(有一个是让参数const,这个情况是你发生修改会警告你,)而这种是,允许你修改,但是不会改变实参的值。

13,请将inline函数写在头文件中。

14,函数指针:int (*p) pc(int ,int );这个就是函数指针,他可以指向,参数类型相同,返回值相同的函数。

int p1(int &p2,int &p3);

p=p1;

这个时候p就指向了p1函数。

p=0;

说明未指向任何函数。

当一个函数名没有使用调用符号是。

如 pc或&pc,他会被编译器解释成 int(*) p1(int &,int & );

原文链接: https://www.cnblogs.com/sdywcd_coffee/archive/2010/01/13/1646391.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/6739

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月6日 下午3:18
下一篇 2023年2月6日 下午3:19

相关推荐