封装性:

关键字:public private protected

破坏封装:友元函数 friend

实现数据的隐藏:class类 默认是私有,结构体默认是公有。

类和对象:(定义类的注意事项)

  • 在类体中不允许对所定义的数据成员进行初始化;
  • 类中的数据成员的类型可以使任意的:
    • 包含整形、浮点型、字符型、数组、指针和引用等;
    • 另一个类的对象,可以作该类的成员;
    • 自身类的对象不可以做该类的成员,但自身的对象的指针和引用可以作该类的成员;
  • 自身类的指针或引用,可以作该类的成员;
  • 当另一个类的对象做为该类的成员时,如果另一个类的定义在后,需要提前说明;
  • 一般在类体内先说明用户感兴趣的公有成员,再说明私有成员;
  • 习惯将类定义的说明部分或者整个定义部分(包含实现部分)放在一个头文件中;

构造函数:

定义:

  • 在每次创建对象时由系统调用,没有任何返回值(包括void)可以用来为某些成员变量设置初始值。

目的:

  • 为了增加对象初始化自己的能力

作用:

  1. 用来在创建对象时初始化对象,多和new运算符一起在创建对象时使用。
  2. 一个类可以有多个构造函数,根据参数的不同和参数类型的不同来区分(构造函数的重载
  3. 构造函数可以包含其他的函数,但是为了保证程序的清晰,一般只在构造函数中加入函数的声明。

特点:

  1. 是一种特殊的成员函数
  2. 不用用户调用,在创建对象时调用
  3. 名字和类名同名
  4. 没有任何类型,没有返回值
  5. 必须是公共的,否则无法生成对象
  6. 只负责为自己的类构造对象
  7. 每个创建一个class系统会自动调用一个构造函数,但是如果用户自己定义构造函数,系统就不会默认提供

下面是几种不同的构造函数:

常见的构造函数:

 .h:

  explicit MainWindow(QWidget *parent = );

 .c:

 MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
} .h: explicit Widget(QWidget *parent = ); .c: Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}

带参数的构造函数:

默认的构造函数没有任何参数,但如果需要,构造函数也可以带有参数。这样在创建对象时就会给对象赋初始值。

例子:

 #include <iostream>

 using namespace std;

 class Line
{
public:
void setLength( double len );
double getLength( void );
Line(double len); // 这是构造函数 private:
double length;
}; // 成员函数定义,包括构造函数
Line::Line( double len)
{
cout << "Object is being created, length = " << len << endl;
length = len;
} void Line::setLength( double len )
{
length = len;
} double Line::getLength( void )
{
return length;
}
// 程序的主函数
int main( )
{
Line line(10.0); // 获取默认设置的长度
cout << "Length of line : " << line.getLength() <<endl;
// 再次设置长度
line.setLength(6.0);
cout << "Length of line : " << line.getLength() <<endl; return ;
}

在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。

使用初始化列表来初始化字段:

下面两种写法等价:

Line::Line( double len): length(len)
{
cout << "Object is being created, length = " << len << endl;
} Line::Line( double len)
{
length = len;
cout << "Object is being created, length = " << len << endl;
}

析构函数:

  • 它会在每次删除所创建的对象时执行。析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。

特点:

  • 和构造函数一样,函数名称不可以自定义  没有返回类型  没有参数  不可以重载  由系统直接调用

作用:

  • 在撤销对象占用的内存前完成一些清理工作,使这部分内存可以被程序分配给新对象使用
  • 执行用户希望在最后一次使用对象后执行的任何操作
  • 如果用户没有定义,系统会自动生成(这个析构函数不会做任何操作)

析构函数执行:

  • 函数定义的自动局部对象,在函数调用结束,对象被释放前调用
  • static局部对象,在main函数或调用exit函数结束程序时调用局部对象的析构函数
  • 全局对象,在函数离开作用域时调用全局对象的析构函数
  • 使用new创建的对象,调用delete时释放该函数,先调用对象的析构函数(需要自己定义)

例如:

 #include <iostream>

 using namespace std;

 class Line
{
public:
void setLength( double len );
double getLength( void );
Line(); // 这是构造函数声明
~Line(); // 这是析构函数声明 private:
double length;
}; // 成员函数定义,包括构造函数
Line::Line(void)
{
cout << "Object is being created" << endl;
}
Line::~Line(void)
{
cout << "Object is being deleted" << endl;
} void Line::setLength( double len )
{
length = len;
} double Line::getLength( void )
{
return length;
}
// 程序的主函数
int main( )
{
Line line; // 设置长度
line.setLength(6.0);
cout << "Length of line : " << line.getLength() <<endl; return ;
}

拷贝构造函数:

总结:

  •  一般初始化工作放在构造函数中,清除工作放在析构函数中
  • 创建对象调用构造函数
  • 对象消亡调用析构函数

02 c++的封装性 (构造和析构)的更多相关文章

  1. Effective C++: 02构造、析构、赋值运算

    05:了解C++默默编写并调用哪些函数 1:一个空类,如果你自己没声明,编译器就会为它声明(编译器版本的)一个copy构造函数.一个copy assignment操作符和一个析构函数.此外如果你没有声 ...

  2. C++的封装性

    C++的封装性 C++的阶段,我想根据C++的一些特有的特性分别写一些专题,每个专题我都捎带讲一些语法,当然不会很多,我还是会像C语言那样,内存结构贯穿始终,有汇编就有真相…… 本专题,我们讲述封装性 ...

  3. C++回顾day02---<对象构造和析构,外加友元函数>

    一:若没有显示写构造函数,默认会有一个默认构造函数(无参),若自己构造后,不会存在这个默认构造函数 二:类成员若是有const修饰,必须在对象初始化的时候,为该类成员赋值(或者一开始就定死,同C中) ...

  4. STL——空间配置器(构造和析构基本工具)

    以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作,默默付出.但若以STL的实现角度而言,第一个需要介绍的就是空间配 ...

  5. Java面向对象(封装性概论)

     Java面向对象(封装性概论) 知识概要:                   (1)面向对象概念 (2)类与对象的关系 (3)封装 (4)构造函数 (5)this关键字 (6)static关键 ...

  6. C++反汇编第二讲,不同作用域下的构造和析构的识别

    C++反汇编第二讲,不同作用域下的构造和析构的识别 目录大纲: 1.全局(静态)对象的识别,(全局静态全局一样的,都是编译期间检查,所以当做全局对象看即可.) 1.1 探究本质,理解构造和析构的生成, ...

  7. C++系列总结——构造与析构

    前言 在使用资源前,我们需要做一些准备工作保证资源能正常使用,在使用完资源后,我们需要做一些扫尾工作保证资源没有泄露,这就是构造与析构了,这和编程语言是无关的,而是使用资源的一种方式.C++只不过是把 ...

  8. JavaScript大杂烩3 - 理解JavaScript对象的封装性

    JavaScript是面向对象的 JavaScript是一种基于对象的语言,你遇到的所有东西,包括字符串,数字,数组,函数等等,都是对象. 面向过程还是面向对象? JavaScript同时兼有的面向过 ...

  9. 程序入口函数和glibc及C++全局构造和析构

    分类: CRT Machnasim 2011-06-15 17:45 144人阅读 评论(0) 收藏 举报 c++汇编linuxlist语言编译器 1,程序入口函数和初始化 操作系统在装载可执行文件后 ...

随机推荐

  1. Github首次使用教程(本地新建项目并同步到Github远程仓库)

    网上关于Github的教程很多且有点乱,自己亲自躺坑实践,现分享出来给将要入坑的小伙伴. 主要步骤: 创建Github帐号,登录,新建仓库(远程仓库) 下载安装Git,git bash配置及简单使用( ...

  2. [转帖]直击案发现场!TCP 10倍延迟的真相是?

    直击案发现场!TCP 10倍延迟的真相是? http://zhuanlan.51cto.com/art/201911/605268.htm 内核参数调优 非常重要啊. 什么是经验?就是遇到问题,解决问 ...

  3. 使用 python 进行微信好友分析

    使用 python 进行微信好友分析 1. 使用到的库 ① wxpy:初始化微信机器人 ② openpyxl:保存微信好友数据为Excel表格 ③ pyecharts:生成可视化的地图 ④ wordc ...

  4. UiPath-level3-test1 and test2 答案

    需要的请联系QQ 1257123976   5-10元一份,必过

  5. day40——数据库、数据库分类、安装、修改密码、字符集编码、简单语句介绍

    day40 详情请看:https://www.cnblogs.com/clschao/articles/9907529.html 数据库 数据库 简而言之可视为电子化的文件柜--存储电子文件的处所,用 ...

  6. Scrapy框架——介绍、安装、命令行创建,启动、项目目录结构介绍、Spiders文件夹详解(包括去重规则)、Selectors解析页面、Items、pipelines(自定义pipeline)、下载中间件(Downloader Middleware)、爬虫中间件、信号

    一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...

  7. Altium Designer 复制报错-奇怪的问题解决办法

    之前AD画原理图复制元件正常使用,今天使用时复制弹出了错误.很是诧异! 各种搜索查找问题,发现或许是因为前一段时间把,电脑上的所有打印机都删除了导致的. 就安装了一个打印机. 再复制,就不报错了. 或 ...

  8. Mysql中HAVING的相关使用方法

    having字句可以让我们筛选分组之后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前. 而having子句在聚合后对组记录进行筛选.我的理解就是真实表 ...

  9. ssh远程连接一段时间会失效的问题

    话不多讲,先说明我的环境和远程环境. 本地环境:Ubuntu18.04(client) 远程环境:Ubuntu16.04(server) 我的一个小项目部署在百度云的Ubuntu服务器上,需要经常使用 ...

  10. go ---fmt

    //main package main import ( "fmt" "os" ) type Data struct { } func (self Data) ...