- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++语法详解之封装、构造函数、析构函数由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
大家先了解下什么是构造函数,什么是析构函数,作用是什么?
构造函数(方法)是对象创建完成后第一个被对象自动调用的方法。它存在于每个声明的类中,是一个特殊的成员方法。作用是执行一些初始化的任务。Php中使用__construct()声明构造方法,并且只能声明一个.
析构函数(方法)作用和构造方法正好相反,是对象被销毁之前最后一个被对象自动调用的方法。是PHP5中新添加的内容作用是用于实现在销毁一个对象之前执行一些特定的操作,诸如关闭文件和释放内存等.
下面在通过具体例子看下C++语法详解之封装、构造函数、析构函数.
成员变量私有化,提供公共的getter和setter给外界去访问成员变量 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class
Person {
int
age;
public
:
void
setAge(
int
age){
this
->age = age;
}
int
getAge(){
return
this
->age;
}
};
int
main(){
Person person;
person.setAge(10);
cout << person.getAge() << endl;
}
|
堆空间 。
在程序运行过程,为了能够自由控制内存的生命周期、大小,会经常使用堆空间的内存 。
堆空间的申请\释放 。
malloc \ free new \ delete new [] \ delete [] 。
注意 。
现在的很多高级编程语言不需要开发人员去管理内存(比如Java),屏蔽了很多内存细节,利弊同时存在 。
例如开盘int类型的空间,使用完之后销毁 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
int
*p = (
int
*)
malloc
(
sizeof
(
int
));
*p = 10;
free
(p);
int
*p2 =
new
int
;
*p2 = 20;
delete
p2;
int
*p3 =
new
int
[3];
*p = 10;
*(p+1) = 20;
*(p+2) = 30;
delete
[] (p3);
|
堆空间的初始化 。
memset 。
memset 函数是将较大的数据结构(比如对象、数组等)内存清零的比较快的方法 。
如下所示 。
1
2
3
4
5
|
Person person;
person.age = 10;
person.height = 199;
//从person的地址开始,每个字节都赋值为0
memset
(&person, 0,
sizeof
(person));
|
初始化 。
1
2
3
|
int
*p1 = (
int
*)
malloc
(
sizeof
(
int
));
//*p1 未初始化
int
*p2 = (
int
*)
malloc
(
sizeof
(
int
));
memset
(p2, 0,
sizeof
(
int
));
//将 *p2 的每一个字节都初始化为0
|
如下几种方式 。
1
2
3
4
5
6
7
|
int *p1 = new int; //未初始化
int *p2 = new int(); //被初始化为0
int *p3 = new int(5); //被初始化为5
int *p4 = new int[3]; //数组元素未被初始化
int *p5 = new int[3](); //3个数组元素都被初始化0
int *p6 = new int[3]{}; //3个数组元素都被初始化0
int *p7 = new int[3]{5}; //数组首元素被初始化为5,其他元素被初始化为0
|
构造函数(Constructor) 。
构造函数(也叫构造器),在对象创建的时候自动调用,一般用于完成对象的初始化工作 。
特点 。
注意 。
通过malloc分配的对象不会调用构造函数 一个广为流传的、很多教程\书籍都推崇的错误结论: 默认情况下,编译器会为每一个类生成空的无参的构造函数 正确理解:在某些特定的情况下,编译器才会为类生成空的无参的构造函数 比如我们自己写2个构造函数 。
1
2
3
4
5
6
7
8
9
10
11
12
|
class
Person{
public
:
int
age;
Person(){
cout <<
"Person()"
<< endl;
}
Person(
int
age){
cout <<
"Person(int age))"
<< endl;
}
};
|
在不同的空间调用的时候,如下区别 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 全局区
Person p1;
//调用Person()
Person p2();
//这是一个函数,函数名是p2,返回值类型是Person,无参
Person p3(18);
//调用 Person(int)
int
main(){
//栈空间
Person p4;
//调用Person()
Person p5();
//这是一个函数,函数名是p5,返回值类型是Person,无参
Person p6(18);
//调用 Person(int)
//堆空间
Person *p7 =
new
Person;
//调用Person()
Person *p8 =
new
Person();
//调用Person()
Person *p9 =
new
Person(20);
//调用 Person(int)
}
|
析构函数 。
析构函数(也叫析构器),在对象销毁的时候自动调用,一般用于完成对象的清理工作 。
特点 。
函数名以~开头,与类同名,无返回值(void都不能写),无参,不可以重载,有且只有一个析构函数 。
注意 。
例如下面的代码 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
class
Cat{
public
:
int
age;
Cat(){
cout <<
"Cat()"
<< endl;
}
~Cat(){
cout <<
"~Cat()"
<< endl;
}
};
class
Person{
public
:
int
age;
Cat *cat;
Person(){
this
->cat =
new
Cat();
cout <<
"Person()"
<< endl;
}
~Person(){
cout <<
"~Person()"
<< endl;
}
};
int
main(){
{
Person person;
}
return
0;
}
|
输出 。
Cat() Person() ~Person() 。
当person销毁的时候,其持有的cat并没有销毁.
原因 。
当person销毁的时候,其指向cat对象的指针销毁了,但是堆空间的cat对象依然存在,就会有内存泄露。所以需要在析构函数里面来释放掉。类似的析构函数在许多其他语言底层也是应用广泛,例如Objective-C的源码中,大量使用析构函数.
代码改成如下所示:
1
2
3
4
|
~Person(){
delete
cat;
cout <<
"~Person()"
<< endl;
}
|
输出 。
Cat() Person() ~Cat() ~Person() 。
可知,cat对象才真正销毁.
总结 。
到此这篇关于C++语法详解之封装、构造函数、析构函数的文章就介绍到这了,更多相关c++ 封装构造函数析构函数内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
最后此篇关于C++语法详解之封装、构造函数、析构函数的文章就讲到这里了,如果你想了解更多关于C++语法详解之封装、构造函数、析构函数的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!