c++中类的构造函数的调用和成员函数有什么区别?
展开全部
请记住,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,那么你可以这样调用它:
aItem.memfunc(...parameters...);
而构造函数却是用来构造对象的。在对象还没形成之前,你怎么能够通过对象去调用函数?所以...你无法通过对象去调用构造函数。你只能采用上面我给出的那些形式,来显式(令编译器为你)调用构造函数。
而析构函数是用于销毁对象的。虽然构造函数和析构函数从实质上来说都是类的成员函数,然而因为它们和对象本身的生命周期有关,所以编译器不允许(逻辑上也不允许)你通过对象来调用它们。所以析构函数是编译器为你自动调用的。就是这样。
这个操作符叫做“函数调用操作符”,又可以用作“类型构造操作符”,它还可以用来作为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,那么你可以这样调用它:
aItem.memfunc(...parameters...);
而构造函数却是用来构造对象的。在对象还没形成之前,你怎么能够通过对象去调用函数?所以...你无法通过对象去调用构造函数。你只能采用上面我给出的那些形式,来显式(令编译器为你)调用构造函数。
而析构函数是用于销毁对象的。虽然构造函数和析构函数从实质上来说都是类的成员函数,然而因为它们和对象本身的生命周期有关,所以编译器不允许(逻辑上也不允许)你通过对象来调用它们。所以析构函数是编译器为你自动调用的。就是这样。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询