类-基础知识

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. CF1090M The Pleasant Walk 题解

    Content 有一个长度为 \(n\) 的数组 \(a_1,a_2,a_3,...,a_n\),并已知有 \(k\) 个不相同的元素求最长连续的一段区间,使得这里面的元素互不相同. 数据范围:\(1 ...

  2. 【LeetCode】 258. Add Digits 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:递归 方法二:减1模9 方法三:直接模9 日 ...

  3. 【LeetCode】136. Single Number 解题报告(Java & Python)

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

  4. 【LeetCode】871. Minimum Number of Refueling Stops 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心算法 日期 题目地址:https://leetc ...

  5. 【剑指Offer】09. 用两个栈实现队列 解题报告(python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 一个栈用来保存输入,一个栈用来输出 日 ...

  6. python语法糖之有参装饰器、无参装饰器

    python的装饰器简单来说就是函数的一种形式,是为了扩展原来的函数功能而设计的. 装饰器的特别之处在于它的返回值也是一个函数,可以在不改变原有函数代码的基础上添加新的功能 # 先定义一个函数及引用# ...

  7. 「Codeforces 468C」Hack it!

    Description 定义 \(f(x)\) 表示 \(x\) 的各个数位之和.现在要求 \(\sum_{i=l}^rf(i)\bmod a\). 显然 ans=solve(l,r)%a; if(a ...

  8. 自动化集成:Docker容器入门简介

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述Docker基础用法. 一.Docker简介 1.基础 ...

  9. MySql各事务隔离级别及锁问题

    聊事务隔离级别和锁问题之前首先得理解事务的隔离级别和共享锁及独占锁的概念: 事务的隔离级别:   脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × ...

  10. Defending Adversarial Attacks by Correcting logits

    目录 概 主要内容 实验 Li Y., Xie L., Zhang Y., Zhang R., Wang Y., Tian Q., Defending Adversarial Attacks by C ...