C++基础 对象的管理——单个对象的管理
1. 为什么要有构造函数和析构函数
面向对象的思想是从生活中来,手机、车出厂时,是一样的。
这些对象都是被初始化后才上市的,初始化是对象普遍存在的一个状态。
普通方案:
对每个类提供一个 init 函数,对象创建后立即调用 init 函数进行初始化。
这种方案麻烦,并且不易用于对象数组。
所以需要构造函数,对应需要析构函数。
2. 对象的构造
(1)构造函数的定义
C++类可以定义与类名相同的特殊成员函数,此函数为构造函数。
构造函数在定时可以有参数,但无任何返回类型声明。
(2)构造函数的调用
自动调用:对象定义时,C++编译器会自动调用构造函数。
手动调用:程序员可手动调用。
(3)构造函数的分类
//有参数构造函数的三种调用方法
class Test
{
private:
int a;
int b;
public:
//无参数构造函数
Test()
{
;
}
//带参数的构造函数
Test(int a, int b)
{
;
}
//赋值构造函数
Test(const Test &obj)
{
;
}
public:
void init(int _a, int _b)
{
a = _a;
b = _b;
}
};
(4)构造函数的调用
(a)无参构造函数
Test t1,t2;
(b)有参构造函数
//有参数构造函数的三种调用方法
class Test5
{
private:
int a;
public:
//带参数的构造函数
Test5(int a)
{
printf("\na:%d", a);
}
Test5(int a, int b)
{
printf("\na:%d b:%d", a, b);
}
public:
};
int main55()
{
Test5 t1(); //c++编译器默认调用有参构造函数 括号法
Test5 t2 = (, ); //c++编译器默认调用有参构造函数 等号法
Test5 t3 = Test5(); //程序员手工调用构造函数 产生了一个对象 直接调用构造构造函数法
system("pause");
;
}
(c)拷贝构造
【1】在函数体内的拷贝构造
注意与拷贝函数区分。
#include "iostream"
using namespace std;
class AA
{
public:
AA() //无参构造函数 默认构造函数
{
cout<<"我是无参构造函数,自动被调用了"<<endl;
}
AA(int _a) //无参构造函数 默认构造函数
{
a = _a;
cout << "我是有参构造函数" << endl;
}
AA(const AA &obj2)
{
cout<<"我也是拷贝构造函数,我是通过另外一个对象obj2,来初始化我自己"<<endl;
a = obj2.a + ;
}
~AA()
{
cout<<"我是析构函数,自动被调用了"<<endl;
}
void getA()
{
printf("a:%d \n", a);
}
protected:
private:
int a;
};
//单独搭建一个舞台
void ObjPlay01()
{
AA a1; //变量定义
//赋值构造函数的第一个应用场景
//用对象1 初始化 对象2
AA a2 = a1; //定义变量并初始化 //初始化法
a2 = a1; //用a1来=号给a2 编译器给我们提供的浅copy
}
int main()
{
ObjPlay01();
system("pause");
}

【2】函数传参时的拷贝构造
#include "iostream"
using namespace std;
class Location
{
public:
Location( , )
{
X = xx ; Y = yy ; cout << "有参构造\n" ;
}
Location( const Location & p ) //复制构造函数
{
X = p.X ; Y = p.Y ; cout << "拷贝构造" << endl ;
}
~Location()
{
cout << X << "," << Y << " 析构" << endl ;
}
int GetX () { return X ; } int GetY () { return Y ; }
private : int X , Y ;
} ;
//alt + f8 排版
void f ( Location p )
{
cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl ;
}
void mainobjplay()
{
Location A ( , ) ; //形参是一个元素,函数调用,会执行实参变量初始化形参变量
f ( A ) ;
}
void main()
{
mainobjplay();
system("pause");
}

(5)默认构造函数
两个特殊的构造函数:
1)默认无参构造函数
当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空。
2)默认拷贝构造函数
当类中没有定义拷贝构造函数时,编译器默认提供一个默认拷贝构造函数,进行浅拷贝。
(6)构造函数调用规则
1)当类中没有定义任何一个构造函数时,c++编译器提供默认无参构造函数和默认拷贝构造函数。
2)当类中定义了拷贝构造函数时,c++编译器不会提供拷贝构造函数。
3)当类中定义了任意非拷贝构造函数,c++编译器不会提供默认无参构造函数。
3. 对象的析构
(1)析构函数的定义
语法:~className()
作用:清理对象
(2)析构函数的调用
对象析构时,C++编译器自动调用。
C++基础 对象的管理——单个对象的管理的更多相关文章
- Objective-C 【单个对象内存管理(野指针&内存泄露)】
------------------------------------------- 单个对象内存管理 (1)野指针 ①定义了一个指针变量,但是并没有赋初值,它随机指向一个东西 ②某指针变量指向的内 ...
- oc55--ARC单个对象的内存管理
// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @end // Person.m #i ...
- redis基础02-redis的5种对象数据类型
表格引用地址:http://www.cnblogs.com/xrq730/p/8944539.html 参考书籍:<Redis设计与实现>,<Redis运维与开发> 1.对象 ...
- [Python] 文科生零基础学编程系列一——对象、集合、属性、方法的基本定义
1.编程语言: 1.1是什么: 编程语言(programming language),是用来定义计算机程序的形式语言.它是一种被标准化的交流技巧,用来向计算机发出指令. 一种计算机语言让程序员能够准确 ...
- JVM 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析
转自:https://blog.csdn.net/tjiyu/article/details/53982412 1-1.为什么需要了解垃圾回收 目前内存的动态分配与内存回收技术已经相当成熟,但为什么还 ...
- mybatis多表关联查询之resultMap单个对象
resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...
- Docker笔记(二):Docker管理的对象
原文地址:http://blog.jboost.cn/2019/07/14/docker-2.html 在Docker笔记(一):什么是Docker中,我们提到了Docker管理的对象包含镜像.容器. ...
- java基础:详解类和对象,类和对象的应用,封装思想,构造方法详解,附练习案列
1. 类和对象 面向对象和面向过程的思想对比 : 面向过程 :是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的 面向对象 :是一种以对象为中心的编程思想,通过指挥对象实现具体的功能 1. ...
- Asp.net MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合
今天为大家分享下 Asp.net MVC 将数据从前台传递到后台的几种方式. 环境:VS2013,MVC5.0框架 1.基本数据类型 我们常见有传递 int, string, bool, double ...
随机推荐
- 我对CSS选择器的认识
我对CSS选择器的认识 一.简述 CSS选择器是对HTML元素进行选择的筛选条件,大概可以分为两类: 特征选择器——根据元素自身所具有的某种特征进行筛选,比如名称.ID.属性等: 关系选择器——根据元 ...
- BZOJ4245: [ONTAK2015]OR-XOR(前缀和)
题意 题目链接 Sol 又是一道非常interesting的题目 很显然要按位考虑 因为最终答案是xor之后or,所以分开之后之后这样位上1的数量是一定是偶数,否则直接加到答案里面 同时,这里面有些部 ...
- Python:Tkinter的GUI设计——物体实时移动
参考: 1.Tkinter之Canvas篇 2.python GUI实践:做一个满图乱跑的小球 3.[Tkinter 教程08] Canvas 图形绘制 4.tkinter模块常用参数(python3 ...
- 编写tab切换插件
html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 解决Pandoc wasn't found.pdflatex not found on PATH
解决nbconvert failed: Pandoc wasn't found.解决nbconvert failed: pdflatex not found on PATH 问题1描述 500 : I ...
- Struts2_使用token拦截器控制重复提交(很少用)
控制重复提交的方式:1.表单提交后页面重定向:2.Struts2.x token拦截器 大致流程: 例子: index.jsp <%@ page language="java" ...
- MVC:控制器名与被调用模型名称发生冲突的解决方案
控制器名与被调用的模型名发生了冲突: 有两种解决方案: (1)将被调用的模型类名进行修改 例如: (2)对被调用的模型进行起一个别名 以上 加油ヾ(◍°∇°◍)ノ゙
- 【转】Xcode真机测试could not find developer disk image解决方法
在使用Xcode进行真机调试的时候,有时根据真机的系统不同,会出现could not find developer disk image 错误,这是由于真机系统过高或者过低,Xcode中没有匹配的配置 ...
- cutil.h问题
CUDA5.0没有cutil.h头文件,貌似用helper_cuda.h文件代替,暂时没出问题.
- 第22章 常用存储器介绍—零死角玩转STM32-F429系列
第22章 常用存储器介绍 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege ...