- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++:构造函数,析构函数详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
上期了解C++类中有public、protected、private三种访问权限.
肯定会有人疑惑,C++为什么要设置这三个权限呢 。
本期内容就是围绕上面的问题展开说明 。
。
开始的文章就提到过,类是(OOP)面向对象编程的基础 。
那么面向对象编程究竟是个什么东东呢 。
百度百科是这样解释的 。
通俗的来说就是利用代码将现实世界的事物抽象出来,使代码更具有真实事物的行为 。
简单举个栗子 。
狗是人类的朋友,有很多人养狗做宠物 。
宠物狗有名字,年龄,毛发颜色,等等特征 。
狗还会吃饭,喝水,汪汪汪之类的行为 。
如果利用代码抽象一个小狗类 。
这些名字,年龄等就对应成员变量 。
吃饭喝水等行为就是成员函数 。
上代码 。
class Dog{protected: int Age; string Name; string Color;public: void Eating() { cout << "吃狗粮" << endl; } void Drinking() { cout << "喝水水" << endl; } void Wangwangwang() { cout << "汪汪汪!!!" << endl; }};
在现实世界中狗的名字我们可以改,但年龄和颜色我们是无法改变的,就比如狗的颜色是它本身DNA决定的。我们可以分辨颜色是因为我们视力没有问题,可以通过看的方式访问狗的颜色 。
所以我们通常在代码里将成员变量设置成protected属性 。
让外部无法直接访问,就像我们无法直接去看狗的DNA序列一样.
所以通常会定义一些成员函数来间接访问成员变量(这里上期讲解遗漏了,下面补充一下) 。
Protected和private无法在类外访问,但可以在自己的类内部被成员函数访问(对外接口) 而将这些成员函数放在public下,在类外使用这些成员函数,就相当于间接访问无法访问的变量 这就体现出C++面向对象中封装的特性 。
我们看看百度百科中对封装的介绍 。
简单 的说,外部使用一个封装好的类的时候只会考虑某些接口的特定功能,而并不会关心内部的具体实现细节.
具体看下图:
那么进入主题,看看封装的具体技术 。
。
基本概念:构造函数是类的成员函数,作用是在类创建对象时用于初始化对象.
特点:函数名和类名相同且不用写返回值,在创建对象时会自动调用.
语法:函数名( 形参列表 ){ 函数实现 } 。
注意:
1.构造函数不需要返回值类型 。
2.构造函数的函数名和类名相同 。
代码如下:
class MyClass{protected: int i; char c; string str;public: void print()//用于显示成员变量 { cout << "i = " << i << endl; cout << "c = " << c << endl; cout << "str = " << str << endl; } MyClass()//构造函数 { i = 5; c = 'a'; str = "str in MyClass"; }};void test(){ //创建对象 cla MyClass cla; //调用 成员函数print cla.print();}int main(){ test(); return 0;}
运行效果:
可见我们只是创建了一个对象,并没有对这个对象做任何操作.
我们不用自己调用构造函数,编译器在创建对象时自动调用构造函数,为变量初始化.
构造函数大概分无参构造、有参构造、拷贝构造三种 。
上述代码中的构造函数就是一个典型的无参构造 。
例如以下代码:(有参构造的3个重载) 。
MyClass(int i){ this->i = i;}MyClass(int i, char c){ this->i = i; this->c = c;}MyClass(int i,char c,string str){ this->i = i; this->c = c; this->str = str;}
括号法:
//使用有参构造函数创建对象 cla2,cla3,cla4MyClass cla2(10);MyClass cla3(10, 'b');MyClass cla4(10, 'b', "str in MyClass_cla2");
等号法:
//使用有参构造函数创建对象(等号法)MyClass cla5 = 10;MyClass cla6 = (10, 'b');
直接调用构造函数 。
//使用有参构造函数创建对象(调用构造函数)MyClass cla7 = MyClass(10);MyClass cla8 = MyClass(10, 'b');MyClass cla9 = MyClass(10, 'b', "str in MyClass");
MyClass(MyClass& cla){ this->i = cla.i; this->c = cla.c; this->str = cla.str;}
注意:拷贝构造函数的形参是自身类型的引用 。
拷贝构造函数调用 。
//使用拷贝构造函数创建对象MyClass cla11(cla8);MyClass cla12 = cla9;
基本概念:在对象被释放时编译器会自动调用析构函数,用于释放对象中变量的内存空间 。
语法:函数名( 形参列表 ){ 函数实现 } 。
注意:
1.构造函数不需要返回值类型 。
2.构造函数的函数名为 ~(类名) 。
特点:函数名和类名相同且不用写返回值,在创建对象时会自动调用.
有人会问,对象内存被释放时成员变量内存空间不是也被释放了吗 。
我们先看一段代码 。
class MyClass{protected: int* p = new int;public: MyClass(int i) { *p = i; }};
这个MyClass类,类成员变量中在内存堆区开辟一个整型变量 。
堆区内存需要手动释放,不然会造成内存泄漏,此时析构函数就派上用处了 。
以下为析构函数代码实现:~MyClass(){ delete p; p = NULL;}
由于制作仓促,如有错误敬请指正 。
。
本期简单介绍OOP面向对象编程和构造函数,析构函数。 原文链接:https://blog.csdn.net/qq_55904031/article/details/120018404 。
最后此篇关于C++:构造函数,析构函数详解的文章就讲到这里了,如果你想了解更多关于C++:构造函数,析构函数详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
谁能解释一下原因: (define a (lambda() (cons a #f))) (car (a)) ==> procedure ((car (a))) ==> (procedure . #f)
这是 PyBrain 网站的摘录。我了解大部分正在发生的事情,但是一行让我完全难住了。我以前从未在 python 代码中看到过这样的东西。这是整个循环,对于上下文: for c in [0,
我是gradle / groovy的新手。我想创建将做一些事情的自定义任务。我的第一个问题是任务完成时该如何做?我可以覆盖doFirst / doLast闭包吗?也许我可以重写某些在开始和结束时都会执
我刚刚开始评估 MS 企业库。他们使用以下指令来获取实例: var customerDb = EnterpriseLibraryContainer.Current.GetInstance("C
这是我的 if else Ansible 逻辑.. - name: Check certs exist stat: path=/etc/letsencrypt/live/{{ rootDomain
我正在使用construct 2.8 对一些失传已久的 Pascal 程序创建的一些文件的 header 进行逆向工程。 header 由许多不同的记录组成,其中一些是可选的,我不确定顺序是否固定。
我在将 getchar() 的输入放入 char *arr[] 数组时遇到问题。我这样做的原因是因为输入数据(将是一个带有命令行参数的文件)将存储在一个 char 指针数组中以传递给 execvp 函
通常我们不能约束类型参数 T派生自密封类型(例如 struct 类型)。这将毫无意义,因为只有一种类型适合,因此不需要泛型。所以约束如下: where T : string 或: where T :
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
#include using namespace std; class A { private: int m_i; friend int main(int argc, char cons
这个问题在这里已经有了答案: Are there legitimate uses for JavaScript's "with" statement? (33 个答案) 关闭 9 年前。 我有这个代
在this answer我看到了下一个 Bash 结构。 yes "$(< file.txt)" 什么意思 "$(< file.txt)" ? 我明白了 命令替换 - $(command)用命令的结
if (a == 1) //do something else if (a == 2) //do something else if (a == 3) //do somethi
关于构造的快速简单的问题。 我有以下用于将项目添加到 ListView 的代码。 ListViewItem item = new ListViewItem(); item.Text = file; i
我想使用 std::vector 来控制给定的内存。首先,我很确定这不是好的做法,但好奇心占了上风,无论如何我都想知道如何做到这一点。 我遇到的问题是这样的方法: vector getRow(unsi
下面显示了一段简单的javascript: var mystring = ("random","ignored","text","h") + ("ello world") 这个字符串会生成 hello
在 Java 中,创建对象的标准方法是使用 MyClass name = new MyClass(); 我也经常看到构造 new MyClass() { /*stuff goes in here*/
我正在编写 C++ ndarray 类。我需要动态大小和编译时大小已知的数组(分别分配自由存储和分配堆栈)。我想支持从嵌套的 std::initializer_list 进行初始化。 动态大小的没问题
我正在将一个项目从 Visual Studio 2005 转换为 Visual Studio 2008,并提出了上述结构。 using Castle.Core.Resource; using Cast
我想知道我在这里的想法是否正确,我主要针对接口(interface)进行编程,所以我想知道下面的类是否应该通过 DI 注入(inject),或者我应该自己实例化一个类... 注意:这些服务保存在我的核
我是一名优秀的程序员,十分优秀!