作者水平有限,文字表述大多摘抄课本,源码部分由课本加自己改编而成,所有代码均在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指针比较重要,单独开一贴讲

C++类复习及新的认识 6.1.1+6.1.2内容(适合看过一遍书的新手)的更多相关文章

  1. Java Math 类中的新功能--浮点数

    Java™语言规范第 5 版向 java.lang.Math和 java.lang.StrictMath添加了 10 种新方法,Java 6 又添加了 10 种.这个共两部分的系列文章的 第 1 部分 ...

  2. AJPFX关于File类复习

    file是一个路径,分为相对路径(eclipse)和绝对路径:1.构造方法有:File(String pathname ),File(String parent ,String child),File ...

  3. Java异常类复习总结

    个人理解先行: 异常类是当在程序出现问题时抛出的一个警告.提示你程序设计或者代码有存在错误的地方. 异常类和Error都继承自Throwable, Throwable继承自Object类. Runti ...

  4. JAVA基础部分复习(一、8中基础类型,以及String相关内容)

    以下是关于java中8种基本类型的介绍说明: package cn.review.day01; /** * java基础复习,8种数据类型 * (byte,short,long,int,double, ...

  5. 新的框架,新的感觉ASP.NET MVC 分享一个简单快速适合新手的框架

    在ASP.NET世界中摸爬滚打好几年,用过了各种框架,在最初的ASP.NET web from 到现在的MVC 在起初的经典三层,到现在的MVC  IOC  注入 . 突然发现,有些时候真不是跟风用一 ...

  6. QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)

    因为项目的需要以及主管的要求,准备将工程移植到Qt中,这样就可以比较容易的实现跨平台了.因为之前工程是在windows下开发的,第一个平台又是mobile所以除了底层框架之外其他的都是使用的windo ...

  7. 我新买的红米手机,新浪和360浏览器都能进,也能看电视,就是不能上手机QQ和微信

    1.请您在桌面下.点击手菜单键-全局搜索,输入网络助手,点击流量排行,点击批量联网控制,查看该软件下(不能上网的应用)wifi和流量2G/3G下方的选项是否都勾选的.如果没有勾选,请您勾选. 2:仍然 ...

  8. File类_常见的方法(获取目录中指定规则的内容)_listFiles

    import java.io.File; public class ListDemo { public static void main(String[] args) { ListDemo(); } ...

  9. File类_常见的方法(获取目录中指定规则的内容)

    首先定义过滤器 import java.io.File; import java.io.FilenameFilter; public class FileByJava implements Filen ...

随机推荐

  1. 吴裕雄--天生自然python编程:turtle模块绘图(1)

    Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行 ...

  2. 第一次安装vs2010无法运行程序,系统找不到exe文件,LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    最近在看数据结构的一些书籍,怎奈代码是c写的,所以安装一个编译器vs2010来测试代码,但是建完文件后编译ok,f5却出现错误:无法启动程序,系统找不到指定文件.上网找了一些解决办法,但是仍然无法解决 ...

  3. (为容器分配独立IP方法二)通过虚拟IP实现docker宿主机增加对外IP接口

    虚拟IP.何为虚拟IP,就是一个未分配给真实主机的IP,也就是说对外提供数据库服务器的主机除了有一个真实IP外还有一个虚IP,使用这两个IP中的任意一个都可以连接到这台主机,所有项目中数据库链接一项配 ...

  4. GRE阅读

    界面和托福差不多,就是反一反 GRE先读文章!因为出题顺序不一致.另外,不能跳读!!每一句都要读,即使不是观点. 考察能力: 1 三秒版本 边读边概括 解决前面的抗遗忘能力 2 句间关系 取同 取反 ...

  5. USB小白学习之路(10) CY7C68013A Slave FIFO模式下的标志位(转)

    转自良子:http://www.eefocus.com/liangziusb/blog/12-11/288618_bdaf9.html CY7C68013含有4个大端点,可以用来处理数据量较大的传输, ...

  6. 第六周学习笔记,vc各类控件的输入输出

    6w学习笔记 vc控件的输入输出 单选按钮 当单击 RadioButton 控件时,其 Checked 属性设置为 true,并且调用 Click 事件处理程序.当 Checked 属性的值更改时,将 ...

  7. zookeeper和dubbo安装与搭建(2)

    Zookeeper+Dubbo安装与搭建(2) (原创:黑小子-余) 一.环境配置:zookeeper3.6.0 + dubbo3.5.4 + maven3.6.1 + jdk1.8 + tomcat ...

  8. 微服务优化之使用gRPC做微服务的内部通信

    使用gRPC做微服务的内部通信 gRPC是一个由Google开源的远程服务调用框架,具有多路复用和双向流式通信的特性. 大家好,在本文中将为大家介绍为什么我们应该使用gRPC代替RESTful或JSO ...

  9. vue的子组件不能进行router的切换

    在用vue开发过程中,偶然一次使用在子组件中进行router的切换,发现不起作用,后来才反应过来,子组件只是一个组件,vue的路由的切换只能是在父组件(也就是真正的页面)里面进行跳转!

  10. hibernate中cascade属性以及inverse属性

    级联操作 cascadecascade的常用属性值 none 默认值 不做任何变动 save-update 保存或修改 delete 删除 all 包含save-update 和delete等行为 c ...