作者水平有限,文字表述大多摘抄课本,源码部分由课本加自己改编而成,所有代码均在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. cesium入门示例-矢量化单体分类

    实现楼层的分层选择和属性信息展示,该功能基于大雁塔倾斜数据实现单体化分类显示. 数据准备: 1.大雁塔倾斜数据,已转换为3dTiles,参考cesium入门示例-3dTiles加载的第2节osgb数据 ...

  2. 吴裕雄--天生自然 R语言开发学习:处理缺失数据的高级方法(续一)

    #-----------------------------------# # R in Action (2nd ed): Chapter 18 # # Advanced methods for mi ...

  3. 用R的dplyr进行数据转换(一)

    在网上找了很久关于数据转换的,都没有找到比较好的.现在为大家整理一下.按照我自己的思路.当然也是为了自己做笔记. 为了方便,大家可以统一安装一个系列的包,这个只需要安装tidyverse这个包就可以, ...

  4. 在腾讯云服务器上安装JDK+Tomcat并启动tomcat

    由于Java web项目需要使用到tomcat所以决定在腾讯云服务器(centos7.X)上安装JDK和tomcat,来部署我们的项目. 准备工具: 云服务器:centos7.x+ 本地连接服务器:X ...

  5. Android Studio那些错误的问题们

    本片博客会记录关于Android开发工具Android Studio出错的那些问题,包括导入项目编译失败.时间过长,莫名其妙的歇菜等等... 问题 3facets cannot be loaded.Y ...

  6. 吴裕雄--天生自然 PYTHON语言数据分析:ESA的火星快车操作数据集分析

    import os import numpy as np import pandas as pd from datetime import datetime import matplotlib imp ...

  7. 复合文字(Compound Literals)

    复合文字(Compound Literals) 阅读代码时发现了这行 1 setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&(int){1},sizeof(in ...

  8. linux系统文件被删的几种恢复方法

    参考链接:https://www.cnblogs.com/276815076/p/5703796.html 1.几种恢复方法,这里只是记录别的博客提到的方法,本人并未亲自验证. ext3用ext3gr ...

  9. CentOS卸载旧版本内核

    CentOS卸载旧版本内核 查看正在使用的内核 uname -a 查看系统中的全部内核 rpm -qa | grep kernel 卸载多余内核 yum remove kernel-x.xx.x

  10. Design Patterns 25

    尽管将一个系统分割成许多对象通常可以增加其可服用性, 但是对象间相互连接的激增又会降低其可复用性了. 大量的连接使得一个对象不可能在没有改变其他对象的支持下工作, 系统表现为一个不可分割的整体, 所以 ...