C++类中为什么只有构造函数和拷贝构造函数有参数列表?
2个回答
展开全部
对类的成员函数声明来说,参数表不是构造函数和拷贝构造函数的专利,一般的类的成员函数,也是可以选择参数个数的。并且还要注意,就算是那些比较“特殊”的成员函数,如operator=,也是有函数表的,而且拷贝构造函数由于其功能的原因,它的参数表还是固定格式的。
我猜你是想问,为啥析构函数就没有参数表呢,如果是,那么这个问题可以从两方面来说:
一是形式。构造函数有不同的参数表,这样你在用类去构造,建立新对象时,你可以通过不同的形式来完成初始化。比如,你可以:
SomeClass obj1,obj2(1,2,3);
SomeClass obj3(obj1);
这样,可以完成不同形式的初始化。但对应的对象的析构,如果这个类对象是自动变量,它就自动在其自动作用域结束的地方析构;如果是new/delete的,编译器也会把代码做成在delete时去自动调用析构,再回收空间。这两种情况下,也都没有给这个对象写出按参数调用析构机会,甚至干脆没有显式调用析构函数的机会,因此析构函数不存在说有参数表一说,要是有,该怎么写呢?也没有用到。
二是功能。为什么会有上边的那种不对称的形式呢?因为对象的构造本身,是按不同的条件,去初始化对象内的成员数据,因此提供不同接口,会带来灵活性。但是对象的析构,很单纯,就是不再要这里所有的数据了,不管你当初是怎么初始化的,现在的目标就是:全部都销毁,有啥毁啥。你可能会问,那如果我初始化时,有可能提供了多种构造方式,那析构时可能也要有多种对应不同的策略,一个析构怎么弄呢?答案还是说回形式上去了:构造就是为了方便类的调用方方便,为其提供多种选择。这不同的选择导致的构造的内部不同,是类应该封装的,即类内代码可以主动去记载构造时的不同方式,析构虽无参数,也可以分别作出自己正确的行为。
最后要多说一句,如果是定位new,那么用户需要自己调用析构。不过按照上段(即二)的分析,也就是调用一下析构函数就行了,不需要指定参数。
我猜你是想问,为啥析构函数就没有参数表呢,如果是,那么这个问题可以从两方面来说:
一是形式。构造函数有不同的参数表,这样你在用类去构造,建立新对象时,你可以通过不同的形式来完成初始化。比如,你可以:
SomeClass obj1,obj2(1,2,3);
SomeClass obj3(obj1);
这样,可以完成不同形式的初始化。但对应的对象的析构,如果这个类对象是自动变量,它就自动在其自动作用域结束的地方析构;如果是new/delete的,编译器也会把代码做成在delete时去自动调用析构,再回收空间。这两种情况下,也都没有给这个对象写出按参数调用析构机会,甚至干脆没有显式调用析构函数的机会,因此析构函数不存在说有参数表一说,要是有,该怎么写呢?也没有用到。
二是功能。为什么会有上边的那种不对称的形式呢?因为对象的构造本身,是按不同的条件,去初始化对象内的成员数据,因此提供不同接口,会带来灵活性。但是对象的析构,很单纯,就是不再要这里所有的数据了,不管你当初是怎么初始化的,现在的目标就是:全部都销毁,有啥毁啥。你可能会问,那如果我初始化时,有可能提供了多种构造方式,那析构时可能也要有多种对应不同的策略,一个析构怎么弄呢?答案还是说回形式上去了:构造就是为了方便类的调用方方便,为其提供多种选择。这不同的选择导致的构造的内部不同,是类应该封装的,即类内代码可以主动去记载构造时的不同方式,析构虽无参数,也可以分别作出自己正确的行为。
最后要多说一句,如果是定位new,那么用户需要自己调用析构。不过按照上段(即二)的分析,也就是调用一下析构函数就行了,不需要指定参数。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询