类-基础知识

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. CF420A Start Up 题解

    Content 给定一个长度为 \(n\) 的字符串,求这个字符串整个反转过来后是否和原字符串一样. 数据范围:\(1\leqslant n\leqslant 10^5\). Solution 众所周 ...

  2. response.setHeader("xxx","大侠")如果赋值中文,那么将不会在页面出值,

    response.setHeader("xxx","大侠")如果赋值中文,那么将不会在页面出值,而非中文就可以在页面出值

  3. 使用yml简化多行sql语句案例

    task:sql:# 将某个值插入到报表- insert into report_app_detail(curr_date,key_name,key_value) values(:curr_date, ...

  4. 平衡二叉树(c++实现)续

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist --- 欢迎指正--- 题外话:上一篇关于平衡二叉树文章中,我都没说自己是怎么理解的.别人终 ...

  5. C/C++ 基本类型 占字节

    下面给出不同位数编译器下的基本数据类型所占的字节数: 16位编译器 char :1个字节char*: 2个字节(即指针变量)short: 2个字节int:  2个字节unsigned int : 2个 ...

  6. 【九度OJ】题目1194:八进制 解题报告

    [九度OJ]题目1194:八进制 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1194 题目描述: 输入一个整数,将其转换 ...

  7. hdu-1593 find a way to escape(贪心,数学)

    思路:两个人都要选取最优的策略. 先求外层那个人的角速度,因为他的角速度是确定的,再求内层人的当角速度和外层人一样时的对应的圆的半径r1.外层圆的半径为d; 那么如果r1>=外围圆的半径,那么肯 ...

  8. @Transactional 注解实现

    @Transactional注解简介 @Transactional是spring中声明式事务管理的注解配置方式,相信这个注解的作用大家都很清楚.@Transactional注解可以帮助我们把事务开启. ...

  9. isEmpty 和 isBlank

    <org.apache.commons.lang3.StringUtils> isEmpty系列 StringUtils.isEmpty() ========> StringUtil ...

  10. Bristol大学密码学博士生的五十二个知识点

    Bristol大学密码学博士生的五十二个知识点 这个系列,是Bristol大学的密码安全工作组为密码学和信息安全相关的博士准备了52个基本知识点. 原地址:http://bristolcrypto.b ...