构造函数、析构函数、this指针、const成员函数

其定义位于类声明中的函数都自动成为内联函数;如果愿意,可以在类声明之外定义成员函数,通过在类的实现部分中定义函数时使用inline限定符,即可使其成为内联函数。

每个新对象都有自己的存储空间,用于存储其内部变量和类成员;但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。

构造函数的参数名不能与类成员相同,因为构造函数的参数表示的是赋给类成员的值。
Stock *pstock=new Stock("electroshock games",18);
这条语句创建一个Stock对象,将其初始化为参数提供的值,并将该对象的地址赋给pstock指针,在这种情况下,对象没有名称,但可以使用指针来管理该对象。
无法使用对象来调用构造函数。因为在构造函数构造出对象之前,对象是不存在的,构造函数是被用来创建对象的,而不能通过对象来调用。
当且仅当没有定义任何构造函数时,编译器才会提供默认的构造函数。为类定义了构造函数后,程序员就必须为它提供默认构造函数。如果提供了非默认构造函数Stock(const char* co,int n),但没有提供默认构造函数,则声明Stock stock1;将出错。这样做的原因可能是想禁止创建未初始化的对象。
隐式地调用默认构造函数声明对象时,不要使用圆括号,否则视为声明返回此类对象的函数。
如果有多个构造函数,则必须以相同的方式使用new,要么都带中括号,要么都不带,因为只有一个析构函数,因此所有的构造函数都必须与它兼容。不过,可以在一个构造函数中使用new来初始化指针,而在另外一个构造函数中将指针初始化为空,这是因为delete可以用于空指针。形式如:str=new char[1];str[0]='/0';或者:str=NULL;

析构函数没有参数。
如果创建的是静态存储类对象,则其析构函数在程序结束时自动被调用;
如果创建的是自动存储类对象,则其析构函数在程序执行完代码块时自动被调用,自动变量被放在堆栈中,因此最后创建的对象将最先被删除;
如果对象是通过new创建的,则它将驻留在堆栈内存或自由存储区中,当使用delete来释放内存时,其析构函数自动被调用。
程序可以创建临时对象来完成特定操作,在这种情况下,程序在结束对该对象的使用时自动调用其析构函数。

通过赋值来设置对象的值:stock1=stock("nifty foods",10);stock1对象已经存在,因此这条语句不是对stock1进行初始化,而是将新值赋给它。这是通过让构造函数创建一个新的、临时的对象,然后将其内容复制给stock1来实现的。随后程序调用析构函数,以删除临时对象。
如果既可以通过初始化,也可以通过赋值来设置对象的值,则应采取初始化的方式,效率更高。

const成员函数
const Stock land=Stock("property",20);
land.show();
C++的编译器将拒绝第二行,因为show()的代码无法确保调用对象不被修改。我们以前通过将函数参数声明为const引用或指向const的指针来解决这种问题,但show()方法并没有参数,因此需要一直新的句法来保证函数不会修改调用对象——将const关键字放在函数的括号后,即:
void show()const;//show()声明
void Stock::show()const //函数定义的开头
以这种方式声明和定义的类函数被称为const成员函数,只要类方法不修改调用对象,应该将其声明为const。

若构造函数只有一个参数,则允许用复制句法来将对象初始化为一个值Classname Object=value。如:
构造函数原型:Bozo(int age);
初始化:Bozo tubby=32;
如果构造函数使用了new,则必须提供使用delete的析构函数。

考虑:类的两个对象比较某个私有数据的大小,返回具有较大值的对象。
设计成员函数:
const Stock Stock::topval(const Stock& s)const
{
 if(s.total_val>total_val)
  return s;
 else   //如何返回调用该函数的对象?
  return...?
}
this指针:指向用来调用成员函数的对象(this被隐式传递给方法)。如果方法需要引用整个调用对象,则可以使用表达式*this。

对象数组
初始化对象数组的方案:首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容复制到相应的元素中。因此,要创建类对象数组,则这个类必须有默认的构造函数。如:
const int STKS=10;
Stock stocks[STKS]={
 Stock("i",12),
 Stock(),
 Stock("ohio",3)
};//上述代码用Stock(const char*,int)来初始化stocks[0],[2],使用Stock()函数初始化stocks[1],用默认构造函数初始化余下7个元素。

要创建一个由所有对象共享的常量,应当使用关键字static。如:
Class Stock{
private:
 static const int len=30;
}
static不能省略。因为声明类只是描述了对象的形式,并没有真正地创建对象,因此,在被对象创建之前,将没有用于存储值的空间。加上static,这将创建一个名为len的常量,该常量将与其他静态变量存储在一起,而不是存储在对象中。但只能用这种方法声明int或枚举的静态常量,而不能存储double常量。
或使用枚举:
Class Stock{
private:
 enum{len=30};
}
用这种方式声明枚举并不会创建类数据成员,也就是说,所有对象中都不包含枚举,len只是一个符号名称,在作用域为整个类的代码中遇到它时,编译器将用30来替换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值