作者水平有限,文字表述大多摘抄课本,源码部分由课本加自己改编而成,所有代码均在vs2019中编译通过

定义类操作

class Tdate
{
public:
void Set(int m, int d, int y ) { month = m ; day = d ; year = y ; }
int IsLeapYear()
{ return ( year% == && year% != )||( year% == ); }
void Print() { cout << year << "." << month << "." << day << endl ; }
private:
int month;
    int day;
     int year;
};

上面是一个时间类的定义,可以看到类中是有成员和成员函数的,成员函数可以在类里面定义也可以在类外定义

在类中定义的成员函数是当作内联函数来处理的,关于内联函数的学习链接:

在类外定义的成员函数当成普通函数处理

上面是从书上的例子,当然,按照好的编程习惯我们应该这么定义,在类里面声明,在类外定义,这样在可以不暴露实现代码的情况下提供外部接口

#ifndef Tdate_H
#define Tdate_H
//Tdate.h #include <iostream>
using std::cin;
using std::cout;
using std::endl; class Tdate

public:
        void  Set(int m, int d, int y ) ;
        int  IsLeapYear();
        void  Print();
private:
        int  month;
      int  day;   
     int  year;
};
#endif
//Tdate.cpp
#include "Tdate.h" void Tdate::Set(int m, int d, int y)
{
month = m; day = d; year = y;
} int Tdate::IsLeapYear()
{
return (year % == && year % != ) || (year % == );
} void Tdate::Print()
{
cout << year << "." << month << "." << day << endl;
}

最后我们在主函数中实现

//main.cpp
#include <iostream>
#include "Tdate.h" int main()
{
Tdate a;
a.Set(, , );
a.Print(); }

F5编译结果

成员的性质由关键字public、protected、private 决定

public         公有     公有段的成员是提供给外部的接口

protected     保护    保护段成员在该类和它的派生类中可见

private       私有     私有段成员仅在类中可见

各段中既可以包含数据成员,也可以包含成员函数

最好还是把数据放到private,成员函数接口放到public

类中定义的一些情况

比如说,类中可以定义一个指向这种类的指针

//例:
class link
{
  link * next ;
  // ……
};

也可以在第二个类中定义第一个类的数据类型

     class  X
{
//……
};
class Y
{ X dataMember ;
//……
};

但是下面一种情况是要避免的

class  X
{
//X dataMember ;这种情况是错误的,会产生无限递归
// ……
};

那么,为什么X类中可以有指向X类的指针,不能有X类的数据成员呢?

因为指针的大小是确定的!指针的大小实际上是由CPU的寻址位数决定,而不是字长。在32位cpu中指针的大小位4b,64位cpu中指针的大小为8B(从指针的意义出发,指针中存放的是目标数据的地址,在32位cpu中寻址宽度是32,64位中寻址宽度就是64)(参考https://blog.csdn.net/lhj_168/article/details/80308041)

类也可以定义无名和空类,一般不推荐,就不写了

其中,空类在编译的时候编译器会自动给它加上一个字节

class empty {};
class test
{
int a;
char b;
};
cout<<sizeof(empty);//编译器编译的时候会将每个类实例化
cout << endl;
cout << sizeof(test);

结果运行是1和8,这是因为空类编译器自动添加一个标识符,占一个字节(当里面有东西的时候这个标识符就不加了),至于8的原因,就是C++编译器会对地址进行对齐(内存大小参考:https://blog.csdn.net/qinghezhen/article/details/9100079)(对齐参考:https://my.oschina.net/u/185531/blog/2222034)至于对齐这个是编译器的原因了,作者暂时没有学编译原理,不敢妄下结论,有兴趣的读者可以自行查询

在类外使用成员或成员函数使用“ . ”和“ -> ”(指针使用的是后者)

6.1.3将会介绍this指针,由于this指针比较重要,单独开一贴讲

最新文章

  1. mono for android 自定义titleBar Actionbar 顶部导航栏 修改 样式 学习
  2. Excel 自动更正
  3. sql之连表查询--效率 通过分析各种连接查询的实现原理来了解
  4. android自动获取短信验证码
  5. CSS hack方式一览【转】
  6. wince中测试驱动应用程序的实现
  7. wkwebview 代理介绍
  8. Popupwindow 的简单实用,(显示在控件下方)
  9. CentOS安装Nexus(Maven私有库)详细配置及上传本地jar到私服
  10. UVALive 5029
  11. 无限循环的ViewPager
  12. virsh -c exs://ip/?no_verify=1 --readonly nodeinfo
  13. CSDN 四川大学线下编程比赛第二题:Peter的X
  14. Android Skia和2D图形系统 .
  15. javascript正则表达式分组捕获理解
  16. ABP框架系列之二十九:(Hangfire-Integration-延迟集成)
  17. Android ConstraintLayout详解(from jianshu)
  18. libgdx退出对话框
  19. vue之props父子组件之间的谈话
  20. 用Eclipse平台进行C/C++开发

热门文章

  1. unittest(20)- 自动更新表格中的测试数据(1)
  2. 吴裕雄--天生自然 R语言开发学习:重抽样与自助法(续一)
  3. MicrosoftOfficeProfessionalPlus2013傻瓜式激活工具
  4. 垃圾回收GC
  5. linux查看端口号占用命令-top
  6. Flask向模板中JS传值简便方式
  7. &ldquo;代码量统计脚本&rdquo;
  8. JavaScript学习之内存
  9. Jun
  10. webpack配置中环境变量-process.env. NODE_ENV