C++对象创建与释放
创建对象有以下四种形式:
#include <iostream>
using namespace std; class A{
private:
int i;
public:
A(){ cout<<"调用没有参数的构造函数"<<endl; }
A(int a):i(a){ cout<<"调用有一个参数的构造函数"<<endl; }
~A(){cout<<"成员变量为:"<<i<<"\t调用析构函数"<<endl;}
}; void main(){
A a0; //形式一:直接声明一个对象
A a1(1); //形式二:隐式调用A带一个参数的构造函数
A a2 = A(2); //形式三:显式调用A带一个参数构造函数
A *p = new A(3); //形式四:动态分配
}
形式一:实际上等同于 A a0 = A();调用不带参数的构造函数进行对象的创建
形式四:在堆内存中动态开辟空间创建对象,需要手动释放内存。
#include <iostream>
using namespace std; class A{
private:
int i;
public:
A(){ cout<<"调用没有参数的构造函数"<<endl; }
A(int a):i(a){ cout<<"调用有一个参数的构造函数"<<endl; }
~A(){cout<<"成员变量为:"<<i<<"\t调用析构函数"<<endl;}
}; void main(){
A a0; //方法一:直接声明一个对象
A a1(1); //方法二:隐式调用A带一个参数的构造函数
A a2 = A(2); //方法三:显式调用A带一个参数构造函数
A *p = new A(3); //方法四:动态分配
delete p;
cout<<"delete后指针p指向的空间:"<<p<<endl;
p=NULL;
}
运行结果如下:
#include <iostream>
using namespace std; class A{
private:
int i;
public:
A(){ cout<<"调用没有参数的构造函数"<<endl; }
A(int a):i(a){ cout<<"调用有一个参数的构造函数"<<endl; }
~A(){cout<<"成员变量为:"<<i<<"\t调用析构函数"<<endl;}
}; void main(){
A a(1);
A *p1 = &a;
delete p1; //希望释放栈中的对象
}
编译没有问题,但运行出错。
#include <iostream>
using namespace std; class A{
private:
int i;
public:
A(){cout<<"调用没有参数的构造函数"<<endl;}
A(int a = 0):i(a){ cout<<"调用有一个参数的构造函数"<<endl; }
}; void main(){
A a0;
}
编译器不知道该调用哪一个构造函数,所以删除其中一个构造函数即可。
C++对象创建与释放的更多相关文章
- .NET Core 对象( Transient、Scope、Singleton )生命周期详解 (对象创建以及释放)
首先我们在VS2019中创建一个.NET Core的控制台程序,方便演示: 需要安装两个依赖包 Microsoft.Extensions.DependencyInjection 依赖注入对象的具体实现 ...
- 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板
[源码下载] 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板 作者:webabcd 介绍不可或缺 Window ...
- C++中new和delete来创建和释放动态数组
在C++编程中,使用new创建数组然后用delete来释放. 一.创建并释放一维数组 #include<iostream> using namespace std; int main() ...
- 关于Java String对象创建的几点疑问
我们通过JDK源码会知道String实质是字符数组,而且是不可被继承(final)和具有不可变性(immutable).可以如果想要了解String的创建我们需要先了解下JVM的内存结构. 1.JVM ...
- 关于String的对象创建
1)String String是Java中的字符串类,属于引用数据类型.所以String的对象存放的是引用的地址.在底层是一个字符型数组. String是不可变的.所谓的不可变是指一个对象有了一个引用 ...
- OC对象,自动释放池,OC与C语言的区别
在C语言中,编程都是面向过程的编程,每一个代码块都严格按照从上至下的顺序执行,在代码块之间同样也是这样, 但是在OC中往往不是这样,OC和C++.java等语言一样,都是面向对象的编程语言,在代码的执 ...
- [你必须知道的.NET]第十九回:对象创建始末(下)
本文将介绍以下内容: 对象的创建过程 内存分配分析 内存布局研究 接上回[第十八回:对象创建始末(上)],继续对对象创建话题的讨论>>> 2.2 托管堆的内存分配机制 引用类型的实例 ...
- [你必须知道的.NET]第十八回:对象创建始末(上)
本文将介绍以下内容: 对象的创建过程 内存分配分析 内存布局研究 1. 引言 了解.NET的内存管理机制,首先应该从内存分配开始,也就是对象的创建环节.对象的创建,是个复杂的过程,主要包括内存分配和初 ...
- 使用C++为对象分配与释放内存时的几个好习惯
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/ 最近在为公司的项目写内存泄漏定位工具,遇到一些关于C++构造与析构对象的问题,在此记录一下 ...
随机推荐
- 序列化与反序列化Serialize&Deserialize
序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了.比如,一个计数器,数值为2,我们可以用字符串“2”表示.如果有个对象,叫做connter, ...
- js 类似php中foreach的方法
参考下面实例 <script>var arr = { 'a' : '111111', 'b' : '222222', 'c' : '333333'};for(var k ...
- centos yum安装mysql
查看有没有安装包 # yum list mysql 安装mysql客户端 # yum install mysql # yum list mysql-server 安装mysql 服务器端 # yum ...
- [Bootstrap] 3. Responsive Gridding (.hidden-sm, visible-md)
Grid Size For .col-md We started designing our site using the col-md-* classes. These classes target ...
- 反射---Java高级开发必须懂的
理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助. 一.Class类的使用 1.万事万物皆 ...
- Linux下批量改动名字方法
如果任务是把文件夹下全部的.log后缀文件名称中的2014去掉. 方法一) 脚本 这样的方法通过ls把当前文件夹下全部的文件进行遍历,然后获取文件名称,进行mv操作.例如以下: #!/bin/sh f ...
- Linux 基础 —— RPM
http://liaoph.com/linux-rpm/ 这篇文章主要讲 RPM 软件包管理器的使用. 软件包的演变史 最早期时,软件包是一些可以运行的程序组成的集合,可能还要加上若干配置文件和动态库 ...
- procps工具集 ----Linux中的可用内存指的是什么?
https://gitlab.com/procps-ng/procps free - Report the amount of free and used memory in the system k ...
- zend studio快捷模板 开发工具之zend studio一些配置
以下是以Zend Studio 10.0.0版本为基础的: 模板的配置(template): [菜单]->[Window]->[preferences]->[PHP]->[Ed ...
- Helpers\Date
Helpers\Date The Date helper is used for calculations with dates. Date::difference($from, $to, $type ...