类-基础知识

1. 语法定义

class class_name{
public:
公有成员(对外接口)
private:
私有成员(私有接口)
protected:
保护性成员
}
  • 成员包含了数据和方法两个部分

  • protected与private类似,其差别表现在继承与派生时对派生类的影响不同

  • 例子(点类)

    class Point
    {
    public:
    //构造函数
    Point(int xx=0, int yy=0) :x(xx), y(yy) {
    cout << "Calling contruction function of Point..." << endl;
    }
    //复制构造函数
    Point(Point &p) {
    cout << "Calling copy construction function of Point.." << endl;
    x = p.getX();
    y = p.getY();
    }
    //类方法
    int getX() { return x; }
    int getY() { return y; }
    void show() {
    cout << "(" << x << "," << y << ")" << endl;
    }
    private:
    int x, y;
    };

2. 类的实现

  • 数据成员定义在类内
  • 方法可以定义在类内,也可以在类外(类名加作用域限定符,指明这个函数是属于这个类的)

3. 三个基本的函数

3.1 构造函数

功能

用于在创建类时给类设定初值

形式

  • 函数名就是类名
  • 没有返回值类型和return语句
  • 可以有形参,也可以没有形参
  • 可以是内联函数
  • 可以重载(可以定义多个构造函数,符合语法即可)
  • 可以带默认参数,如果所有的参数都带默认参数,该构造函数就是默认构造函数

Note:在声明中定义了默认参数时,实现中不能再指定默认参数。下面代码运行会报错

void func(int x = 0);
void func(int x = 0){
cout << x << endl;
}

调用时机

  • 按照构造函数形式初始化类
  • 类之间的相互赋值=(不是复制构造函数)

默认构造函数

  • 未定义构造函数时,编译器默认不生成构造函数,如果需要,则指定为class_name()=default

  • 默认构造函数的函数列表为空

  • 类内定义了数据的初始值时,用初始值初始化,否则以默认方式初始化

  • 基本数据类型的初始化值不确定!

3.2 复制构造函数

功能

用一个已经初始化好的对象去初始化本类的一个新对象,形参为已知对象的引用(因为复制构造函数还未定义,无法通过复制的方式传递参数)

形式

class 类名 {
public :
类名( 形参);//构造函数
类名( const 类名 &对象名);//复制构造函数
// ...
};
  • 未定义复制构造函数时,编译器会生成默认的复制构造函数
  • 不让编译器生成默认构造函数需要用=delete指定

调用时机

  • 函数参数传递
  • 函数返回值
  • 以本类的一个对象作为初始值定义新的对象

3.3 析构函数

  • 完成对象被删除前的一些清理工作。
  • 在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。
  • 如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数,其函数体为空。
  • 声明为~class_name()

4. 类组合

概念

一个类中的成员是另一个对象。比如线段类包含了点类:

class Line
{
//public:
// Line(Point pp1, Point pp2);
// Line(Line &l);
// double get_len() { return len; } private:
Point p1, p2;
double len;
};

设计

  • 要同时对本类基本成员和对象成员初始化

  • 声明:

    类名::类名(对象成员所需的形参,本类成员形参):对象1(参数),对象2(参数), ......
    {
    //函数体其他语句
    }

    Note:冒号后面的部分实际上是在调用复制构造函数。也可以将该部分省略,放到函数体内用=赋值

实例:线段类

// 点类
class Point
{
public:
Point(int xx=0, int yy=0) :x(xx), y(yy) {
cout << "Calling contruction function of Point..." << endl;
}
Point(Point &p) {
cout << "Calling copy construction function of Point.." << endl;
x = p.getX();
y = p.getY();
}
int getX() { return x; }
int getY() { return y; }
void show() {
cout << "(" << x << "," << y << ")" << endl;
}
private:
int x, y;
}; //线段类
class Line
{
public:
Line(Point pp1, Point pp2);
Line(Line &l);
double get_len() { return len; } private:
Point p1, p2;
double len;
}; Line::Line(Point pp1, Point pp2)
: p1(pp1), p2(pp2){
cout << "Calling constuction function of Line..." << endl;
double x = pp1.getX() - pp2.getX();
double y = pp1.getY() - pp2.getY();
len = sqrt(x * x + y * y);
}
Line::Line(Line &l){
p1 = l.p1;
p2 = l.p2;
len = l.get_len();
}

【C++】类-基础知识的更多相关文章

  1. java核心-多线程(4)-线程类基础知识

    1.并发 <1>使用并发的一个重要原因是提高执行效率.由于I/O等情况阻塞,单个任务并不能充分利用CPU时间.所以在单处理器的机器上也应该使用并发. <2>为了实现并发,操作系 ...

  2. Python类基础知识(面向对象基础)

    #首先 我们需要了解 面向过程是什么 面向对象是什么 我们为什么需要使用面向对象 面向过程:根据业务逻辑从上到下写垒代码 面向对象:根据代码对函数进行分类和封装 区别:解决问题的逻辑不同,但是都能解决 ...

  3. String类基础知识

    1.String类的构造方法 (1)String(String original)  //把字符串数据封装成字符串对象 (2)String(char[] c)   //把字符数组的数据封装成字符串对象 ...

  4. JAVA核心技术I---JAVA基础知识(工具类Arrays和Collections类)

    一:工具类 –不存储数据,而是在数据容器上,实现高效操作 • 排序 • 搜索 –Arrays类 –Collection类 二:Arrays类(处理数组) (一)基本方法 –排序:对数组排序, sort ...

  5. 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素

    [源码下载] 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中 ...

  6. 背水一战 Windows 10 (75) - 控件(控件基类): FrameworkElement - 基础知识, 相关事件, HorizontalAlignment, VerticalAlignment

    [源码下载] 背水一战 Windows 10 (75) - 控件(控件基类): FrameworkElement - 基础知识, 相关事件, HorizontalAlignment, Vertical ...

  7. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  8. ASP.NET Core 基础知识(四) Startup.cs类

    ASP.NET Core应用程序需要一个启动类,按照约定命名为Startup.在 Program 类的主机生成器上调用 Build 时,将生成应用的主机, 通常通过在主机生成器上调用 WebHostB ...

  9. ASP.NET Core 基础知识(三) Program.cs类

    ASP.NET Framework应用程序是严重依赖于IIS的,System.Web 中有很多方法都是直接调用的 IIS API,并且它还是驻留在IIS进程中的.而 ASP.NET Core 的运行则 ...

随机推荐

  1. LuoguP2382 化学分子式 题解

    Description 你的任务是编写一个能处理在虚拟的化学里分子式的程序,具体地说,给定你所有原子的相对原子质量,求出所有询问的分子的相对分子质量,或者报告不存在. 数据范围:原子质量 \(\leq ...

  2. git 命令之暂存相关指令。

    git 命令之暂存相关指令. 1.git 代码暂存指令:git stash 2.git 代码暂存列表信息:git stash list 3.git 代码应用暂存代码:git stash apply s ...

  3. c++设计模式概述之观察者

    代码写的不够规范,目的是缩短篇幅,实际情况请不要这样做 1.概述 观察者模式,类比生活中的场景,比如看电影,观众对播放的内容有不同的反应, 再比如订阅,公众号订阅,只要你订阅了其公众号,你就会收到其推 ...

  4. 【LeetCode】260. Single Number III 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 异或 字典 日期 题目地址:https://leet ...

  5. RXD and math

    RXD and math 题目链接 思路 \(u\)函数是莫比乌斯函数,这个不影响做题,这个式子算的是\([1,n^k]\)中能够写成\(a*b^2\)的数的个数,\(u(a)!=0\).然后我们可以 ...

  6. (原创)WinForm中莫名其妙的小BUG——RichTextBox自动选择字词问题

    一.前言 使用WinForm很久了,多多少少会遇到一些小BUG. 这些小BUG影响并不严重,而且稍微设置一下就能正常使用,而且微软一直也没有修复这些小BUG. 写本系列文章,是为了记录一下这些无伤大雅 ...

  7. vue路由history模式刷新404问题解决方案

    更改router 的base // biz是二级目录,路由文件改成 const router = new VueRouter({ mode: 'history', // base: process.e ...

  8. CS5211完全替代兼容LT7211|PS8625|CH7511方案|EDP转LVDS|Capstone CS5211

    CH7511|LT7211|PS8625替代方案--Capstone CS5211AN 设计EDP转LVDS优势方案原理图+PCB板设计 CH7511|LT7211|PS8625这三款都是专门用于设计 ...

  9. Java面向对象笔记 • 【第9章 JDBC编程】

    全部章节   >>>> 本章目录 9.1 JDBC基础 9.1.1 JDBC简介 9.1.2 JDBC常用API简介 JDBC 常用API功能说明 9.1.3 JDBC编程步骤 ...

  10. pod运行到指定node节点

    利用labels 1.一般来说都每个节点有自己特有的labels  比如 2.利用nodeSelector nodeSelector: kubernetes.io/hostname: master3 ...