当前位置: 首页 > 工具软件 > CppTest > 使用案例 >

cppTest-6.0:类&对象&成员

百里胜泫
2023-12-01
/**
 *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...}的赋值,只有最后一个才能赋值成功,而且是赋给了单值构造函数。
	//最好不要用这种赋值方式,很乱!
}

 类似资料: