1. 写一个基本的类

上手C++以来,仅熟练使用if、for等基本语句的我有很多疑惑,本篇主要解答以下问题:

  • 类是什么

  • public & private 的作用

  • 创建一个类,.cpp和.h文件怎么写?

  • #ifdef # ifndef 有什么用

1.1 类是什么

数据结构是把一组相关的数据元素组织起来,然后使用它们的策略和方法。比如说树的定义:

struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

类,即自定义数据结构,TreeNode 就是一个类。 class 和 struct 的唯一区别在于默认访问权限不同。访问权限涉及到了类的一个主要特性——封装。

1.2 类的访问级别

对任何一个常见的类,calss关键字后接类名,类名后的大括号里会出现plublic、private和protected等关键字,即指出了此部分成员的访问级别。不指定访问说明符时,class 默认为 private ,而 struct 默认为 public。

class Lexer{
//private:int lastChar = ' ';string identifierStr;double numVal;public:double GetNumVal();string GetIndStr();
};
  • 我们一般将接口写成public,类的接口包括用户所能执行的操作(构造函数和部分成员函数),以便于实例化一个对象后调用接口部分的提供的功能;
  • 将实现写在private部分,包括负责接口实现的函数体,以及所需的各种私有变量和函数,这一部分的函数和变量是对象调用不了的,外界不了解的;
  • 此外还有protected的声明,只能给class本身的函数以及从该class派生出来的子类使用(爸爸保护起来的就是要给儿子的)

类的基本思想是数据抽象封装。数据抽象是一种依赖于接口和实现分离的编程技术,封装即隐藏了类的实现细节,只有接口部分的成员可以在整个程序内被访问,通过访问说明符实现这种访问控制。

封装后的模块相对独立,类具体的实现细节可以自由修改,只要接口不发生改变,用户代码就无需改变, 同时用户代码也不能轻易破坏封装对象的状态。比如一家包子铺,其接口为用钱买包子,所有用户都只需要调用其接口,包子铺为提高效率更新生产包子的工具不影响用户访问,用户的行为也不会破坏其生产。

1.3 类的头文件 .h 与源文件 .cpp

在 CLion 中新建一个 C++ Class的时候,会自动创建一个 .h 头文件和一个 .cpp 源文件,这两个文件怎么写?

先说结论,将类的成员变量和成员函数的申明放在头文件中,成员函数的实现过程放在源文件中,使得头文件较为简洁,便于阅读和修改。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-csN1yi72-1601016026681)(…/…/figure/image-20200901152811165.png)]

如果要问为什么,这可能是工程实践的经验所形成的规范吧。我理解的是,当代码比较简单地时候我们定义了一个类,把class写在main.cpp里面,class函数定义在class大括号里面,也没什么问题。

但是如果这个类要经常在其他文件里复用呢?把代码复制过去显然不是一个好办法,所以我们可以把类放在单独的文件中,文件名与类名一致。写在一个文中,.cpp / .h / .cc 后缀其实差不多,当一个类成员函数很多的时候,比如看一看我们常用的string类,把声明和函数具体实现写在一起会很难阅读,所以我们又把声明放在了头文件中,实现放在源文件中,在源文件中#include头文件。


1.4 预处理功能 ifdef & ifndef

写好了头文件后,我们会在要使用该类的源文件中 #include 该头文件,#include就是一种预处理功能,预处理器会在程序编译以前用指定的头文件内容替换此命令。

我们还需要考虑一个问题,如果一个工程的几个文件中都使用了test类,那么就会#Include头文件多次,多次包含头文件可能导致重复定义等问题,使程序不能稳定运行。所以一般在头文件中会用到另一种预处理功能——头文件保护符。

#ifndef检查一个变量是否被定义,若没有被定义则为真,#ifdef相反。若为真,则执行后续操作直到#endif为止,反之,忽略到#endif部分代码。

1. 写一个基本的类相关推荐

  1. (一)、写一个怪物的类,类中有属性姓名(name),攻击力(attack),有打人的方法(fight)。(方法的重写)...

    (一).写一个怪物的类,类中有属性姓名(name),攻击力(attack),有打人的方法(fight). 再写两个子类: 红猪的类:类中有属性姓名(name),攻击力(attack),颜色(color ...

  2. 自己写一个数据库连接工具类

    最近刚复习了一下JDBC相关的知识,这里来写一个mysql数据库连接工具类来练习一下. 在jdbc连接数据库时,Connection对象是非常稀有的资源,用完后必须马上释放,如果Connection不 ...

  3. java 计时 timeclock_用 java 写一个clock的类,100毫秒的时钟 求代码。。越简单越好。。最好有注释...

    展开全部 这里有一个时钟的类,你看一下吧,不明白你的 100毫秒的时钟 是什么意思. import java.awt.BasicStroke; import java.awt.BorderLayout ...

  4. Java写一个excel工具类_Java中Excel写操作工具类--Java免费学习网

    核心提示:package com.common.excel;import com.common.excel.exception.WriteExcelException;import jxl.Workb ...

  5. 写一个测试工具类,只在debug时运行,而release时自动移除代码,适用于gradle项目(idea,android studio等)

    前言 平时开发有很多测试期间需要写的代码(比如日志),如何不让其在正式环境下运行呢?或者不让其在正式环境下存在(防止反编译查到重要信息) 实现方法 1.通过混淆(废弃,因为需要打开优化开关,经测打开后 ...

  6. 写一个楼房盘类java语言编写_Java开发每日复盘2018_0514

    今天主要跟大家分享3个部分: 一.「Java的核心机制」 二.「Java命名规范」 三.「Java数据类型相关」 下面我们来一个一个的说: 「Java核心机制」 Java是一种强制面向对象的解释型语言 ...

  7. java jdbc操作类_Java-编写一个jdbc操作类

    package数据库操作类;/** Db.java Created on 2007年8月20日, 上午 8:37*/ import java.io.*;import java.sql.*;import ...

  8. 用java写一个单例类_Java 写一个单例模式(Singleton)出来

    第一种:饱汉模式 public  class   SingleTon{ private  SingleTon(){ } //实例化放在静态代码块里可提高程序的执行效率,但也可能更占用空间 privat ...

  9. java攻击力与命中_JAVA写一个怪物的类,类中有属性姓名,攻击力,有打人的方法。...

    展开全部 //filename:Monster.java public interface Monster { public String getName(); public Integer getA ...

最新文章

  1. 11.python并发入门(part9 多进程模块multiprocessing基本用法)
  2. MySQL协议.NET Core实现(一)
  3. Html 教程 (10)分组标签div 和span
  4. python程序改错题字符统计_Python练习题 012:字符统计
  5. 数据质量提升_合作提高数据质量
  6. linux系统能装什么显卡,Linux系统下安装显卡驱动
  7. Java 蓝桥杯 A+B problem
  8. python爬虫实战:《星球大战》豆瓣影评分析
  9. Spring.NET学习笔记13——AOP的概念(基础篇) Level 200
  10. QT widget窗体设置主次
  11. vf省计算机考试题库,计算机二级VF上机题库及答案
  12. 华为/华三IS-IS单区域配置
  13. Java操作DB2 XML数据实践
  14. github java开源项目经验_GitHub 上最火的开源项目 —— Java 篇
  15. java授权失败_鉴权失败 =(-200)both online
  16. “构建之法”--第三次作业:原型设计
  17. mysql desc select_数据库里 desc 和 select 怎么用,代表什么意思?
  18. 腹板拼接宽度_钢结构工程部件拼接一般规定
  19. 软件测试二分查找函数,二分查找
  20. ​​​​​​过滤器和拦截器详解

热门文章

  1. webpack打包之sourcemap
  2. 【React】redux中引入createStore有删除线
  3. Oracle批量执行脚本文件
  4. 大一计算机专业能用到电脑吗,哪些专业大一需要电脑 大一新生可以带吗
  5. 东方红品牌网络代理商计划表
  6. 基于LabVIEW的飞机大作战小游戏(可做毕设)
  7. 中国市场只是全豹一斑 来看看诺基亚在全球的颓势(诺基亚的悲剧可说是从其死守塞班系统开始的)
  8. leetcode_205. 同构字符串
  9. ManageEngine的EventLog Analyzer许可信息
  10. 学校机房/实验室电脑免全屏广播控制解决方案