c++函数能把对象作为参数吗
发布时间:2025-05-24 14:22:40 发布人:远客网络
一、c++函数能把对象作为参数吗
C++是面向对象的体制,函数又是构成C/C++语言程序的最小模块,就是说C/C++语言程序就是由函数组成的。那么试想,如果C++的函数不能把对象作为传递参数,那C++的“面向对象”体制如何实现?所以C++的函数不仅可以以对象作为参数传递,而且方便得就像传递一个普通变量一样……
二、C++的成员函数和普通函数
1、首先要知道类存在的理由,为何要面向对象。
2、C中的结构体就是定义一种数据格式,可以存储若干数据元素,并且它们的内存是连续的。
3、结构体的作用是封装一组有关联的属性,它们共同维护某种概念实体的状态。
4、在早期经典纯C工程当中,有经验的开发者早就开始利用结构体与函数指针实现简单的面向对象。
5、但是用结构体+函数指针使用不方便不灵活,所以C++最大的使命,面向对象就诞生了。
6、要注意的是C++与C的区别除了类之外,还有函数多态的特性、命名空间、STL等等特性。
7、类相比于结构体+函数指针最大的优势就是两个字:继承
8、撤了一大堆废话,针对LZ的问题可以归结为,在没有属性的时候,只有函数,使用类好不好,或者说何时可以如此使用。
9、如果LZ学习过设计模式,那么这个问题就颇为清晰,类的存在是为了更灵活地描述某种概念实体以及对它的操作。
10、一个只有函数而没有属性的类,其描述的实体可以认为是一种抽象的动作实体。
11、用通俗的话来讲,一个继承Animal的Cat类描述一个猫,猫有属性(形态,叫声,年龄等),也有动作(吃喝拉撒睡),这就是最经典LZ也熟知的一种类。
12、而抽象的动作类,就有比如一个继承File的DiskFile或者FtpFile等,它主要描述的是一组动作(读与写),它也许有状态(属性),也许没有。
13、这种抽象的动作类为何而存在?经典的策略设计模式就会大量地使用这种写法。
14、比如你要做视频处理软件,视频需要解码与加码如果只是用纯函数的化你的代码就会如下丑陋:
15、}elseif(0==strcmp(fileType,MP4)){
16、}elseif(0==strcmp(fileType,MP4)){
17、}
但是如果你有一个类AVType,只有两个函数:encode、decode,然后有AVIType、MP4Type继承它,那么你的代码大致就是:
18、但是如果你有一个类AVType,只有两个函数:encode、decode,然后有AVIType、MP4Type继承它,那么你的代码大致就是:
19、AVType*type=newAVIType();//orMP4Type
20、type->encode(file);
当你的同类方法多起来(如rmvb、wmv、flv解码器等等),你就会发现后者有多优秀。
21、当你的同类方法多起来(如rmvb、wmv、flv解码器等等),你就会发现后者有多优秀。
22、最后总结对LZ的问题的回答就是:
23、如果没有继承也不会存在潜在继承的可能,也就是说用不到C++的多态特新,那么没有属性的类就没有存在的必要。
24、今天闲的无聊,说了一堆废话,LZ跳着看就行了O(∩_∩)O~
三、C++函数返回值为对象与返回值为对象的引用的区别
1、返回对象时,C++调用类默认的拷贝构造函数,将返回值拷贝到等号的左值;
2、如果返回引用的话,不发生拷贝,只是把返回对象的“别名”赋给了等号的左值;所以如果返回是局部变量的话,比较危险,可能编译不过吧,你试一下。
3、你可以写一个类,定义他的拷贝构造函数,加些打印跟踪一下;