目录
1.类和对象的基本概念
1.c语言与c++中的结构体
2.类的封装性
3.定义类
4.构造与析构
构造与析构的概念:
构造函数
析构函数
拷贝构造函数
c++默认增加的函数
我们知道在c语言里,我们是无法在结构体内部定义函数的,但在c++里,我们可以定义函数。从这里我们就可以看出c++对于数据(属性)和行为(方法)是封装的。它可以在数据的储存里同时添加了数据操作的功能。
所谓封装就是将抽象得到的数据和行为相结合,形成一个有机体,及就是将数据与操作数据的函数代码进行有机的结合,形成类,其中的数据和函数都是类的成员。
类将具有共性的数据和方法封装在一起,加以权限区分,用户只能通过公共的方法访问私有数据。
类的权限分为:private (私有) ,public (公有), protected(保护)三种权限。
这些权限是针对类外部的访问,只有公有(public)数据才能被访问,在没有涉及到继承与派生是,private和protected是同等级的,外部都不允许访问,要想访问到该成员,只能通过公有的方式间接访问到这两类数据。
类的关键字 class ,类的定义方式为:
class 类名
{
成员列表
}
举个例子:
/定义一个类
class Data
{
private:
int a;//私有数据 也是默认的类型
protected:
int b;//保护数据
public:
int c;//公有数据
void showdata()//方法
{
cout << a << " " << b << " " << c << endl;
}
};
//使用类
int main()
{
//定义Data类的一个对象
Data data;
//只能访问公有的数据
cout << data.c<
设计一个类需要我们对该类的方法与数据做出详细的判断,比如设计一个人的类
class person
{
private:
char pname[20];
int page;
char pIDnumber[10];
public:
void Initperson(char* name,int age, char *IDnumber)//初始化person
{
strcpy(pname, name);
if (age > 0)
{
page = age;
}
else
{
cout << "错误格式" << endl;
}
strcpy(pIDnumber, IDnumber);
}
//修改名字
void setname(char *arr)
{
strcpy(pname, arr);
}
//修改年龄
void setage(int age)
{
if (age > 0)
page = age;
}
//修改身份号码
void setIDnumber(char* arr)
{
strcpy(pIDnumber, arr);
}
//打印信息
void showperson()
{
cout << "姓名:" << pname << endl;
cout << "年龄:" << page << endl;
cout << "身份号码:" << pIDnumber << endl;
}
};
int main()
{
//定义两个person类的对象
person jack;
//初始化
jack.Initperson((char*)"jack", 12,(char *)"123456");
jack.setage(18);
jack.showperson();
return 0;
}
class Data
{
private:
int a;//私有数据
protected:
int b;//保护数据
public:
int c;//公有数据
void showdata()//方法
{
cout << a << " " << b << " " << c << endl;
}
void getA(int a);
};
void Data::getA(int A)
{
a = A;
}
class Data
{
private:
int a;//私有数据
protected:
int b;//保护数据
public:
Data()//无参构造函数
{
c= 0;
}
int c;//公有数据
Data(int x,int y)//有参构造函数
{
c = x;
a=y;
}
};
int main()
{
//隐式调用无参构造函数(未创建构造函数,构造函数默认为无参的)
Data b1;
//显示调用无参构造函数
Data b2=Data();
//隐式调用有参构造函数
Data b3(1,2);
//显式调用有参构造函数
Data b4 = Data(1,2);
//匿名对象(无名构造对象) 存活周期为当前语句结束,立即释放
Data();
Data(20,10);
//构造函数隐式转换(类中只有一个数据成员)
Data b5 = 100;
}
class Data1
{
private:
int a;//私有数据
protected:
int b;//保护数据
public:
Data1(int x)//有参构造函数
{
c= x;
cout << "构造函数:" << c << endl;
}
int c;
~Data1()//析构函数
{
cout<<"析构函数:"<
运行来通过打印顺序发现函数调用顺序:
一般析构函数为空,这里只是展示一下调用关系才写了打印功能。
一般不写析构函数,但若存指针,必须要写析构函数,因为所在堆区空间,默认是无法释放的,会造成内存泄漏,我们要创建析构函数释放这一部分空间。
拷贝构造:本质是构造函数
拷贝构造函数的调用时机
总结一种情况: 旧对象初始化新对象