/**
*cppTest-6.0:类&对象&成员
*
*这个例子基本涵盖了c++的类定义(成员变量和成员函数、构造函数、复制构造函数、析构函数等等)、
*对象初始化(有参、无参、new方式)等等。
*author 炜sama
*/
#include<iostream.h>
#include<string.h>
//一般也把struct称为特殊的类。
//在C++中,结构体类型也可以有成员函数,但它与类类型不同之处在于它的成员的隐含访问权限是公开的,
//因为结构体用于组织相关的不同类型数据,而类主要是体现信息隐藏原则。
struct sclass{
private:
int a;
int b;
public://结构体中成员默认是public的,注释掉也没关系
void print();
};
//只定义类时不用引入头文件!!!也可以没有main函数(这跟Java一样...)
//在一个类中只有3种函数与类名同名:构造函数、复制构造函数、析构函数。
class Location{
private://类中成员默认是private的,注释掉也没关系
int X,Y;
//int z=0;//定义类时不能初始化成员变量!与Java不同!
public:
int i;//把成员变量声明为public也是没错的,但是不建议这么做!因为不符合信息隐藏原则。
public:
//这些函数如果不实现,有两种结果:
//1、没有被被调用过的函数在编译时和build时都不会提示错误。
//2、如果有被调用的话,在编译时不会出错,但是在build时就会提示错误!
//构造函数与Java的差不多
Location();
Location(int x){X=x;}
Location(int x,int y);
//复制构造函数
Location(Location &l){X=l.X;Y=l.Y;};//“&”不能省!!!后面的分号有没有都无所谓,因为大括号已经表明结束标志。
//析构函数
~Location(){cout<<"~Location()"<<endl;}
void init(int initX,int initY);
int GetX();
int GetY();
void print();
void printX(){cout<<"x:"<<X<<endl;}//直接在类里面实现的函数自动成为内联函数,也叫内部函数,这是方式1
void printY();
void test();
};//与Java不同,类定义完后要以“;”号结尾!!!
Location::Location(){
X=0;
Y=0;
}
Location::Location(int x,int y){
X=x;
Y=y;
}
void Location::init(int initX,int initY)
{
X=initX;
Y=initY;
i=10;
}
int Location::GetX()
{
return X;
}
int Location::GetY()
{
return Y;
}
void Location::print(){
cout<<"x:"<<X<<";"<<"y"<<":"<<Y<<endl;
}
//在类外面加inline关键字实现的也是内部函数,这是方式2。
//成员函数被说明为inline是对编译程序的申请(或暗示),表示你欢迎对此函数用内部扩展方法编译。
inline void Location::printY(){
cout<<"y"<<":"<<Y<<endl;
}
//main函数放在类里编译时没有错误,但是build时就出错了,是因为当前项目没有main函数的原因?
void main()
{
Location A,B;//不用像Java那样要new出来!
A.init(5,3);
B.init(6,2);
cout<<A.GetX()<<"-"<<A.GetY()<<endl;
cout<<B.GetX()<<"-"<<B.GetY()<<endl;
A.print();
A=B;
A.print();
Location *loc;
loc=&A;
loc->print();//不打括号时没错,但是没有任何内容输出!
cout<<loc->i<<endl;
loc->printX();
loc->printY();
int *p=new int(10);
cout<<*p<<endl;
delete p;
int *pi=new int[10];
*pi=0;
cout<<*pi<<endl;
delete []pi;
Location *pl=new Location();
pl->print();
delete pl;
Location *pl2=new Location(100,200);
pl2->print();
delete pl2;
Location l;//利用无参构造函数来初始化
l.print();
Location l1=1;//这样子赋值也是没错的!这个1直接赋给Location类的Location(int x){X=x;}构造函数!
cout<<l1.GetX()<<endl;
cout<<l1.GetY()<<endl;
Location l2(0,1);//与Java有点差别,Java是这样的形式:Location l2=new Location(0,1);
l2.print();
Location l22=(1,3);//这样子只有最后一个3才赋值成功了!这个3直接赋给Location类的Location(int x){X=x;}构造函数!
l22.print();
Location l23=(1,3,4);//这样子只有最后一个4才赋值成功了!这个4直接赋给Location类的Location(int x){X=x;}构造函数!
l23.print();
//总结:经过测试,类似这种Location l23=(i0,i1,i2...}的赋值,只有最后一个才能赋值成功,而且是赋给了单值构造函数。
//最好不要用这种赋值方式,很乱!
}
cppTest-6.0:类&对象&成员
最新推荐文章于 2018-08-15 10:02:38 发布