成员函数是一个类或者结构体的内部成员函数,属于这个类或者结构体的接口。重载函数是名字相同但是参数或参数个数或者返回值类型不同。C++中就称为重载函数。比如:int �0�2a();void a();int a( int param );都是重载函数。构造函数是一个类或者结构体的对象初始化的函数。比如:class aaa{�0�2 �0�2 �0�2 aaa(){} �0�2 // 就是aaa类的构造函数,必须与类或结构体的名字相同。用于初始化类或结构体的成员变量等;}
1、虚析构函数和析构函数在功能上是一回事,因此除了动态联编(此处意思:需要销毁
父类指针指向的子类对象的空间)外,其他性质和析构函数类似。
2、析构函数与构造函数名字相同,但它前面必须加一个波浪号(~);
3、析构函数没有参数,也没有返回值,而且不能重载。因此在一个类中只能有一个析构函数;当撤消对象时,编译系统会自动地调用析构函数。
构造函数主要用来对成员初始化和分配空间,析构函数用于执行一些清理任务,如释放分配给对象的内存空间等。
构造函数有以下特点:
1构造函数的名字必须与类名相同;
2构造函数可以有任意类型的参数,但不能具有返回类型;
3定义对象时,编译系统会自动地调用构造函数;
4构造函数是特殊的成员函数,函数体可以在类体内,也可写在类体外;
5构造函数被声明为公有函数,但它不能像其他成员函数那样被显式调用,它是在定义对象的同时被调用的。
析构函数有以下特点:
1析构函数的名字必须与类名相同,但它前面必须加一个波浪号 ~ ;
2析构函数没有参数,也没有返回值,而且不能被重载,因此在一个类中只能有一个析构函数;
3当撤销对象时,编译系统会自动地调用析构函数。
构造函数与普通函数的区别:
1 返回值类型的区别:
1 构造函数是没有返回值类型 的,
2 普通函数是有返回值类型的,即使函数没有返回值,返回值类型也要写上void。
2 函数名的区别:
1 构造函数的函数名必须要与类名一致,
2 普通函数的函数名只要符合标识符的命名规则即可。
3 调用方式的区别:
1 构造函数是 在创建对象的时候由jvm调用的。
2 普通函数是由我们使用对象调用的,一个对象可以对象多次普通 的函数,
4 作用上的区别:
1 构造函数 的作用用于初始化一个对象。
2 普通函数是用于描述一类事物的公共行为的。
请记住,C++中,括号"()"除了用来判定表达式优先级之外,它还是 *** 作符。
这个 *** 作符叫做“函数调用 *** 作符”,又可以用作“类型构造 *** 作符”,它还可以用来作为C风格的“类型转换 *** 作符”。
比如,你可以这样定义一个整数,并将其初始化为8:
#include <iostream>
int main(int argc, char argv[])
{
int aInteger(8); // 注意这里我是怎么初始化aInterger的。
std::cout << aInterger << std::end;
return 0;
}
在上面那个表达式中,“()”就代表“类型构造 *** 作符”。
当然了,当你使用“()”去调用函数时,它就是“函数调用 *** 作符”;当你用它去强制转换一个对象的类型(C风格)时,它就是“类型转换 *** 作符”。
所以,如果你要构造一个自定义类的对象时,可以使用“类型构造 *** 作符”。这将导致编译器为你调用构造函数。
比如你写了一个类,叫BaseItem显然你可以这样定义一个BaseItem对象:
BaseItem aItem; // 调用默认构造函数;
你还可以这样定义一个BaseItem对象:
BaseItem aItem = BaseItem(); // 调用默认构造函数。这里"()"表示“类型构造 *** 作符”,
// 用来实例化一个对象
假如你的构造函数接受一个string对象作为参数,你还可以这样定义BaseItem:
BaseItem aItem("This is a base item"); // 这会使编译器为你调用相应的构造函数。
ok,上面的都明白了嘛?下面再开始讲类的构造函数和成员函数有什么区别。
(非静态)成员函数是通过对象/指向对象的指针/指向对象的引用来调用的。你只能通过这3种方式来调用一个成员函数。那么很显然,实质上无论如何要调用成员函数都必须通过对象。
比如BaseItem里面有一个成员函数叫memfunc,那么你可以这样调用它:
aItemmemfunc(parameters);
而构造函数却是用来构造对象的。在对象还没形成之前,你怎么能够通过对象去调用函数?所以你无法通过对象去调用构造函数。你只能采用上面我给出的那些形式,来显式(令编译器为你)调用构造函数。
而析构函数是用于销毁对象的。虽然构造函数和析构函数从实质上来说都是类的成员函数,然而因为它们和对象本身的生命周期有关,所以编译器不允许(逻辑上也不允许)你通过对象来调用它们。所以析构函数是编译器为你自动调用的。就是这样。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)