c++学习笔记之【类的构建】

c++学习笔记之【类的构建】

c++是一门oop【面向对象编程】语言,作为一门面向对象的语言,类是一个很重要的概念,它可以实现对数据和方法的封装,让程序结构更加清晰等。接下来浅浅聊下我关于类的构建的方法。

什么是类:

类是一种自定义的数据类型,同时可以提供服务。类是对某些事物的集合,类中包含这个事物的属性,行为(方法),标识。例如说“狗”这一集合里面,就会包含狗的外表特征,狗的行为能力,还有“狗”这一标识。总的来说,类的实例就是一个对象。

类的权限:

类内的权限分为三种,分别是public、protected、private。
这三个权限下有不同的成员,如以下代码:

class example{
publicint a;
protected:
	char b;
	private:
	int c;
};

其中的整形变量a的访问权限是public,字符型变量b的访问权限是protected,整形变量c的访问权限是private.
以下说一下他们三者的区别:

public:

从字面意思,理解为公共的权限,访问权限为公共的成员,可以在类外被访问,也可以被他的派生类(子类)所访问。
一般来讲我们可以在public中定义成员函数,做到接口的作用,在外界通过public的成员函数进行访问protected和private访问权限的成员。

protected:

protect是个形容词,保护的,protected是它的被动形式,被保护的,也就说在这个权限下的成员是被保护的,只能被类内的成员或者友元的类或函数访问,类外不能直接访问它,只能通过public中你的成员函数来访问protected中的成员。与private不同的是,protected权限的成员在派生类中是可以被访问的。

private:

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的不同之处:

struct:

在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++中可以直接这样声明
}

class:

在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)
  {
  }
};
 

接下来说说一般成员函数的定义与声明

一般成员函数的定义与声明:

成员函数的定义一般有以下三种方法

1.在类内声明,在类外定义:

class test{
public:
	int a(int i);
private:
	int age;};
	int test::a(int i){
	age=i+20;
	return age;
	}/*定义方法如下:返回类型 类名::函数名(参数表){}/*

2.在类内声明并定义:

class test{public:
	int a(int i){age=i+20;
	return age;};
private:
	int age;};

3、将函数作为内联函数处理:

class test{public:
	inline int a(int i);//在类内声明成员函数a为内联函数
private:
	int age;
	};
	inline int test::a(int i)
	{age=i+20;
	return age;}//在类外定义内联函数a

以上就是成员函数的定义与声明方法。

总结:

今天的学习日记就到这里了,创造不易,望佬们点个赞,点点收藏,最后附上尼采的一句话:

每个不曾起舞的日子,都是对生活的辜负

你可能感兴趣的:(c++学习笔记,c++,学习,开发语言)