class stcok
{
private :
void set_tot();
public :
...
}
inline void stcok::set_tot() //在类声明之外定义函数,为内联函数,加限定符inline即可
{
tot_val = .....
}
**********************************************************************************************
拷贝构造函数
在变量中 int a=10; int b=a;
在类当中,类对象赋值是靠拷贝构造函数
当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:
1 一个对象以值传递的方式传入函数体
2 一个对象以值传递的方式从函数返回
3 一个对象需要通过另外一个对象进行初始化
如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。位拷贝又称浅拷贝.
在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。
这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。
例如:
#include <vector>
class RuleOfThree {
char* cstring;
public:
RuleOfThree(const char* arg) :cstring(new char[std::strlen(arg)+1])
{
std::strcpy(cstring,arg);
}
~RuleOfThree()
{
delete[] cstring;
}
RuleOfThree(const RuleOfTher& other){ //在这里从新分配了资源
cstring = new char[std::strlen(other.cstring)+1]
std::strcpy(cstring , other.cstring);
}
}
*****************************************************************************************