C++C++自学旅程:类类型初识——类的定义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++C++自学旅程:类类型初识——类的定义相关的知识,希望对你有一定的参考价值。

  新年第一博,新年快乐!

  一直不明白面对对象的“对象”是什么意思,想象不出;在学OC时出现了奇怪的语法,让程序“自己”运行;EDA的沙龙中提到了类类型,但不知道这是个什么鬼。终于这些问题的谜底要被我自己自学揭开了,哈哈哈!类类型我来啦!

  类(Class)是一种自定义数据类型,是具有相同属性和行为的一组对象的集合,它是面向对象中最为重要的概念之一。类类型中有变量来存储属性和数据,叫做成员变量数据成员,还有操作这些数据的函数,叫做成员函数

  类类型的作用:

    • 实现封装
    • 数据隐藏
    • 继承和派生多态
    • ……

  使用类时,用户不需要了解类的具体实现,只需要通过外部接口,以特定的访问权限来使用类的成员即可。PS:由类类型声明的变量叫做对象,也就是说对象实际上就是变量。

  以上还有很多看不懂的内容,慢慢学应该就会懂的。

  类类型的声明用class关键字,格式跟struct一样。class类型的完整定义格式:

 1 class 类名
 2 {
 3 public:
 4     数据类型 成员变量名;
 5     函数类型 成员函数名 (形参列表);
 6     ......
 7 private:
 8     数据类型 成员变量名;
 9     函数类型 成员函数名 (形参列表);
10     ......
11 protected:
12     ......
13 };    //";"不要忘记了!
14 
15 //成员函数的定义
16 函数类型 类名::成员函数名(形参列表)
17 {
18     函数体;
19 }

  可以看出,类类型中有三种访问权限:公有访问权限(public)、私有访问权限(private)和保护访问权限(protected)。

  ①公共访问权限

  在公共访问权限中的成员变量和成员函数可以从任何外部函数访问,比如d1.year。公有成员函数一般成为公有接口。

  ②私有访问权限

  只能从该类的内部访问到的成员变量和函数,不能通过小圆点"."从外部函数访问,只能通过类里面定义的共有接口进行访问,这体现了C++面向对象编程的第一个特性:封装特性。

  在成员函数的定义中,对该类的所有成员操作不必使用圆点运算符,即cin>>year;而不是cin>>d1.year。

  ③保护访问权限(还不懂)

  一个类的派生类的成员函数可以直接访问继承该类的保护成员变量,而不能继承访问私有成员变量,这就是它与私有访问权限的不同。

 

  成员变量如果是私有,那么需要公共接口来对数据进行输入输出,这就需要定义取值函数、赋值函数。上面讲了一大通,包括取值赋值函数怎么用?实例:

 1 //类类型初试:日期比较
 2 #include<iostream>
 3 using namespace std;
 4 class Date  //定义类类型,Date为类型名
 5 {
 6 public:
 7     void input();  //输入的公共接口
 8     void output();  //输出的公共接口
 9     int getyear();  //取值函数
10     int getmonth();  //取值函数
11     int getday();  //取值函数
12 private:
13     int year;  //私有的成员变量
14     int month;
15     int day;
16 }d1,d2;  //d1,d2是对象,也可以另外定义,如Date d1,d2;
17 void Date::input()
18 {
19     cout<<"请输入年、月、日:"<<endl;
20     cin>>year>>month>>day;  //直接可以对year、month、day等私有变量进行操作
21     cout<<"输入完毕!"<<endl;
22 }
23 void Date::output()
24 {
25     cout<<year<<""<<month<<""<<day<<""<<endl;
26 }
27 int Date::getyear()
28 {
29     return year;
30 }
31 int Date::getmonth()
32 {
33     return month;
34 }
35 int Date::getday()
36 {
37     return day;
38 }
39 int compare()
40 {
41     if(d1.getyear()==d2.getyear()&&d1.getmonth()==d2.getmonth()&&d1.getday()==d2.getday())  //分别比较d1 d2的各项数据
42     {
43         cout<<"两个日期相同!"<<endl;
44         return 0;
45     }
46     else
47     {
48         cout<<"两个日期不同,它们分别是:"<<endl;
49         cout<<"d1:";
50         d1.output();
51         cout<<"d2:";
52         d2.output();
53     }
54 }
55 
56 int main()
57 {
58     cout<<"类类型初试:比较日期!"<<endl;
59     d1.input();
60     d2.input();
61     compare();
62 }

  从上面这些东西就可以看出怎么用了。这个程序运行时:提示输入两个日期,然后比较两个日期是否一样,一样则输出一样,不一样则输出不一样且加上各自日期。

  内联成员函数用于成员函数本身比较短小,功能简单但频繁使用(如取值赋值函数),有显式、隐式声明两种:

 1 //显式内联函数
 2 class Count
 3 {
 4     int t;
 5 public:
 6     void output();
 7 };
 8 inline void Count::output()
 9 {
10     cout<<"小涛最帅!"<<endl;
11 }
12 
13 //隐式内联函数
14 class Count
15 {
16     int t;
17 public:
18     void output()
19     {
20             cout<<"小涛最帅!"<<endl;
21     }
22 };

  内联函数执行速度比一般函数速度要快,但是如果函数体过大,一般的编译器就会放弃内联,采用一般方式调用函数了。

 

  再说一个this指针,它指的是目前调用的对象,一般写代码的时候省略了,其实真正是this->year = y;.....

  使用的情景:

1 void Date::setDate(int year, int m, int d)
2 {
3     (*this).year=year; //(*this).year是数据成员year,year是形参year
4 }

 

以上是关于C++C++自学旅程:类类型初识——类的定义的主要内容,如果未能解决你的问题,请参考以下文章

C++C++自学旅程(10):巨有成就感!:C++类类型结合运用实战

C++C++自学旅程:数组与字符数组

c++_类和对象

c++_类和对象

C++Primer 第七章

初识Java类