类
C++++中的类就是把struct这种特殊的数据类型强化了一下,变成包括普通数据类型和函数的特殊的“struct”,连调用方法都一样!
1,基本用法
首先是类声明:
class World
{
private:
float mass;
char name[20];
public:
void tellall(void);
……
};
private表示是私有的,就是只能这个类中的函数才能调用;
public表示对外开放,在别的函数中也可以使用,但是要加类名。
类声明之后就可以定义了:
void World::tellall(void)
{
std::cout << mass << std::endl;
std::cout << name << std::endl;
}
因为tellall()是类World之中的函数,所以前面要使用::操作符表示是对World这个类里面的tellall()函数进行定义,因为说不定别的类里面也有tellall()这个函数。类函数可以直接使用private里面的变量,不需要加什么前缀操作符之类,因为他们是一家子的。
下面到使用阶段:
因为类虽然是一个特殊的“struct”,但也是数据类型不是,所以直接声明变量:
World test;
这样test就是World类对象了,private里面的对象就不要想了,外部函数用不了,只能使用public中的,用法与struct对象一样:
test.tellall();
这样就调用了World类里面的tellall()函数.
2,类的初始化
a,World()函数初始化。
实际上,类对象在声明的时候都有一个初始化,用的时函数World()(没错,跟类一个名字,就当重载好了)。当我们在类声明里面没有指定World()的时候,编译器会给我们做一个World()函数,并定义为空函数,在声明变量的时候对变量进行初始化。但是这个时候的类是个空类,直接使用tellall()类函数会报错,必须先初始化了具体数据才可以使用。如果我们在声明里面做了声明,并在类实现里定义了函数原型,编译器就会按照函数原型对类型进行声明,并给变量响应的值,这时候再调用tellall()就不会出错了。
World::World()
{
mass = 0.0;
strcpy(name, “maydolly”);
}
b,World(double, char *)函数重载初始化
另一种初始化方法就是命名一个名字和类名字一样,但是有参数的函数,也是重载的方法,这样初始化的时候可以填入指定的值了。
World::World(double ms, char * na)
{
mass = ms;
strcpy(name, na);
}
声明变量的时候可以用:
World test1 = World(5.5, “maydolly”);
World test2(5.5, “maydolly”);
当然还可以使用指针
World * test3 = new World(5.5,“maydolly”);
3,类释放
当类释放的时候,编译器会默认一个释放函数~World(),没有参数。当然我们也可以丰富一下这个函数,先声明,然后定义:
World::~World()
{
std:: <<“Bye, ” << name << std::endl;
}
4,const与类
想在类函数使用的时候保护类中的数据,可以添加const操作符。
对类函数中调用参数的保护,const用法和平常一样,但是对整个类进行保护时,const放在函数名后面:
声明:void World::tellall() const;
定义:void World::tellall() const {……}
5,this用法(类返回)
a,类函数返回类本身
有点儿拗口,就是类test1的函数topval(),在函数中需要返回test1时,使用(*)this返回。this指示的是test1的地址,根据返回类型确定是this还是*this。
const Stock & Stock::topval(const Stock & s) const
{
if(s.total_val > total_val)
return s;// 返回类对象s
else
return this;// 返回类函数的类对象
}
这里,使用的时候为test3 = test1.topval(test2); 函数返回test1或者test2给test3.
b,类函数中新建类的返回
Stock Stock::sum(Stock & test1, Stock & test2)
{
Stock test;
test.total_val = test1.total_val+test2.total_val;
return test;
}
注意这里的返回类型不能是Stock &, 即不能是类的引用。因为test是局部变量,如果在类函数sum()结束的时候会被释放,如果返回是test的引用,test释放掉之后,引用也没用了,所以需要返回test。这时候返回的是test的副本,不会被释放掉。
6,类对象数组
和普通数组对象声明方法一样:
Stock mystuff[4];
或者自带初始化
Stock stocks[4] = {
Stock(“NanoSmart”, 12.5, 20),
Stock(“Boffo Objects”, 200, 2.0)
};
前两个指定,后两个默认。