c++是一门oop【面向对象编程】语言,作为一门面向对象的语言,类是一个很重要的概念,它可以实现对数据和方法的封装,让程序结构更加清晰等。接下来浅浅聊下我关于类的构建的方法。
类是一种自定义的数据类型,同时可以提供服务。类是对某些事物的集合,类中包含这个事物的属性,行为(方法),标识。例如说“狗”这一集合里面,就会包含狗的外表特征,狗的行为能力,还有“狗”这一标识。总的来说,类的实例就是一个对象。
类内的权限分为三种,分别是public、protected、private。
这三个权限下有不同的成员,如以下代码:
class example{
public:
int a;
protected:
char b;
private:
int c;
};
其中的整形变量a的访问权限是public,字符型变量b的访问权限是protected,整形变量c的访问权限是private.
以下说一下他们三者的区别:
从字面意思,理解为公共的权限,访问权限为公共的成员,可以在类外被访问,也可以被他的派生类(子类)所访问。
一般来讲我们可以在public中定义成员函数,做到接口的作用,在外界通过public的成员函数进行访问protected和private访问权限的成员。
protect是个形容词,保护的,protected是它的被动形式,被保护的,也就说在这个权限下的成员是被保护的,只能被类内的成员或者友元的类或函数访问,类外不能直接访问它,只能通过public中你的成员函数来访问protected中的成员。与private不同的是,protected权限的成员在派生类中是可以被访问的。
private,私有的,拥有这一个访问权限的成员,只能被类内的成员或者友元的函数和类所访问。在类外与派生类中都不能被访问,只能通过public权限的成员函数来访问它,并传回它的值。
以上便是三种权限的不同,接下来我们通过一段代码来进一步了解:
#include //c++的万能头文件
using namespace std;
class example{
public:
int a=0;
char b_v(){return b;} //构建成员函数,当调用它的时候,会返回b的值;
int c_v(){return c;} //构建成员函数,当调用它的时候,会返回b的值;
protected:
char b="a";
private:
int c=4;
};//定义-example类;
int main(){
example ex;
cout<<ex.a;//合法 因为a的访问权限是公共的,可以在类外被访问,结果是打印0;
cout<<ex.b;//违法的操作,b的访问权限是被保护的,无法在类外被访问。
cout<<<ex.c;//同样是违法的操作,c的访问权限是private,也无法在类外被访问
cout<<ex.b_V();//合法的操作,结果是打印"a"
cout<<ex.c_v();//合法的操作,结果是打印4;
return 0;}
至于在派生类中的实例,后续将在关于继承的学习笔记中给出。
在c++中,类的声明通常使用class关键词,基本语法如下
class 类名{
访问权限:
成员
};标志类的声明完成
值得一提的是,如果在class中不实用public和protected修饰的话,class会默认将类内的访问权限设为private。
在c的基础上,c++的struct也可以用来声明类,并定义类的成员函数,以下简单说下关于struct和class的不同之处:
在c++中引入struct是为了保持对c的兼容性,同时也引申一些东西,在声明时的不同如下表所示:
c | c++ | |
---|---|---|
定义成员函数 | 不能定义成员函数 | 可以定义成员函数 |
设置静态成员 | 不能将数据成员设为静态成员 | 可以将数据成员设为静态成员 |
访问权限 | 默认public,不能修改 | 默认public,可以修改为private和protected |
继承 | 不能继承 | 可以从类或结构体中继承 |
初始化 | 不能直接初始化数据成员 | 可以初始化数据成员 |
同样的,struct的使用在c和c++中也有不同,如在c中使用时,需要加上struct,而在c中不用,如下列代码所示:
struct stu{
int a;
int b;};
int main(){
struct stu a1;//在c中必须这样声明结构体变量
stu a2;//c++中可以直接这样声明
}
在c++中,class是声明类的关键词,在class中不实用public和protected修饰的话,class会默认将类内的访问权限设为private。
至于struct与class的不同,唯一的不同在于他们的默认防控权限,其中struct为public,class为private,这意味着默认情况下,class内部的成员都是private的,而struct是public的,在继承的时候,如果不声明继承方式的话,struct是以public的方式继承的,而class是以private的方式进行继承的。
成员函数是在类中声明的函数,是类的成员之一,值得一提是有几种特殊的成员函数,以下先讲讲这些特殊函数的概念:
在c++中,需要定义一个与类名相同的函数,这个函数叫做构造函数,在类定义时,编译器会自动调用构造函数进行对成员的初始化。在某些特定的情况下需要手动调用,在类的生命周期中,一个构造函数只会被调用一次。
一个类中可以有多个构造函数,使用时根据传入参数不同决定使用那个构造函数。不同的构造函数通过参数的数据类型和个数来区分。值得一提的是,构造函数没有任何的返回类型。
一般来说,如果你没有定义一个构造函数,编译器会自动帮你定义一个不带参数的构造函数。我们也可以重载这个函数。
以下是一段示例代码:
class person{
public:
int age;
person(int a,int b) age=a*b;
person() age=0;
}
其中的两个person都是构造函数,如果不传入参数的话,会默认将age设为0岁。
类的构造函数可以直接访问类内部的所有成员,可以通过构造函数初始化类的成员。
初始化类成员的方法有两种,其中一种是直接在构造函数中初始化,即上面代码中无参的构造函数。另外一种是通过使用类似于类成员引用的方法进行初始化,如下列代码
class person{
public:
int age;
person(int i) age(i);
}
以上便是关于构造函数的一些知识,接下来我们说说析构函数
在一个类中可以有多个构造函数,但只能有一个析构函数,析构函数与类同名,与构造函数不同的是,析构函数需要在函数名前加上~符号表示析构函数。
析构函数没有返回类型,同时,它也不允许存在参数,这也是为什么析构函数只能有一个的原因。
析构函数在类的生命周期的最末进行调用,一般用来做善后的工作。如果你没有声明和定义析构函数,那么编译器也会帮你默认定义一个析构函数。
class person{
public:
int age;
person(int i) age(i);
~person() cout<<age;//在person类结束他的生命周期时,会调用这个析构函数打印age的值。
析构函数是在对象即将销毁前自动执行的,其执行顺序与构造函数执行顺序相反。
一般来说,我们可以存在多个构造函数,但只能存在一个析构函数,构造函数在类定义时被调用,而析构函数则是在类被销毁前调用,所以我们可以在构造函数中给类分配资源,在类的析构函数中释放对应的资源。
拷贝构造函数又叫做复制构造函数,是一类特殊的构造函数,由编译器来调用完成基于同一类的一些对象的构造以及初始化,可以将它理解为利用旧对象去构造一个新的对象。
拷贝构造函数对于参数表中的类型要求必须是对本类对象的引用,而不能是值,如果传入的参数是一个值则会出行无限递归的情况。虽然传入的参数如果是个指针能满足条件,但是会存在歧义。
所以对于拷贝构造函数形参而言,它必须是一个本类对象的const引用。
拷贝构造函数一般用于函数调用时用户定义类型的值传递及返回。
如果不显式地去声明拷贝构造函数的话,编译器会自动帮你定义一个拷贝复制函数,缺省的拷贝构造函数的特点是按位进行拷贝。
构造拷贝函数的声明和定义如下:
class test
{
int year;
int month;
int day;
public:
//构造函数
test(int y=1,int m=1,int d=1):year(y),month(m),day(d)
{
}
//拷贝构造函数
test(const test &cd):year(cd.year),month(cd.month),day(cd.day)
{
}
};
接下来说说一般成员函数的定义与声明
成员函数的定义一般有以下三种方法
class test{
public:
int a(int i);
private:
int age;};
int test::a(int i){
age=i+20;
return age;
}/*定义方法如下:返回类型 类名::函数名(参数表){}/*
class test{public:
int a(int i){age=i+20;
return age;};
private:
int age;};
class test{public:
inline int a(int i);//在类内声明成员函数a为内联函数
private:
int age;
};
inline int test::a(int i)
{age=i+20;
return age;}//在类外定义内联函数a
以上就是成员函数的定义与声明方法。
今天的学习日记就到这里了,创造不易,望佬们点个赞,点点收藏,最后附上尼采的一句话:
每个不曾起舞的日子,都是对生活的辜负