c++创建对象的几种方式
- 不通过“new”关键字,在栈上创建
- 通过关键字“new”,在堆上创建
两种方式的区别
在栈中的对象,其作用范围只是在函数内部,函数执行完成后就会调用析构函数,删除该对象。使用 “.” 而不是 “->” 调用对象的方法。
在堆中的对象,必须要程序员手动的去管理该对象的内存空间 。用运算符“->”调用对象的方法。new出来的对象必须用指针指明地址。
例子:
(1)无参构造函数:
#include <iostream>using namespace std;class Line
{public:void setLength( double len );double getLength( void );Line(); // 这是构造函数private:double length;
};// 成员函数定义,包括构造函数
Line::Line(void)
{cout << "Object is being created" << 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 0;
}
结果:
Object is being created Length of line : 6
(2)有参构造函数
#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 0;
}
结果:
Object is being created, length = 10 Length of line : 10 Length of line : 6
(3)new来创建
// 对于对象
class TestNew
{private:int ID;public:TestNew(int ID);~TestNew();
};TestNew::TestNew(int ID)
{this->ID = ID;
}TestNew::~TestNew()
{std::cout<<"对象 "<<this->ID<<" 执行析构函数"<<std::endl;delete ;
}
void Test()
{TestNew test(1);//创建对象1,不使用newTestNew *pTest = new TestNew(1);//创建对象2,使用newdelete pTest; // new的东西记得删除
}
int main()
{Test();
}
结果:
再来一个例子
#include <iostream>
using namespace std;
class test {
public:void print(int n) {cout << "This is t" << n << "." << endl;}
};
int main() {test t1; //在栈(stack)上分配空间test t2 = test(); //也是在栈(stack)上分配空间test* t3 = new test(); //在堆(heap)上分配空间test* t4; //只是声明,还没有分配空间t1.print(1);t2.print(2);t3->print(3);delete t3;return 0;
}
This is t1.
This is t2.
This is t3.
现在总结一下静态对象
(1)全局静态对象在程序执行 main() 之前已经分配好存储空间 ,在 main() 执行完成后进行释放。
#include "fstream"
#include "string"
using namespace std;void writeMessageToFile(const string& msg)
{ofstream ofs;ofs.open("test.txt", ios::app);ofs << msg << endl<<endl;ofs.close();
}
class TestClass
{
public:TestClass() { writeMessageToFile( "TestClass() 执行");}~TestClass(){ writeMessageToFile("~TestClass() 执行"); }
};static TestClass test;int main()
{writeMessageToFile("main() 开始执行");//writeMessageToFile("main() 结束执行");return 0;
}
(2)局部静态对象是从其所在函数第一次被调用时进行创建,直到整个程序结束才进行销毁;局部静态对象只有在第一次调用时进行初始化操作。
#include "iostream"
using namespace std;int main()
{for (int i = 0; i < 5; ++i){static int s = 0;s++;cout << s << endl;}system("pause");return 0;
}
c++创建对象的几种方式相关推荐
- 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...
作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...
- Java中创建对象的几种方式
Java中创建对象的几种方式 1.使用new创建对象,在堆上创建. 2.克隆 3.反序列化 4.反射创建对象 5.NIO中可以使用本地方法直接分配堆外内存. 转载于:https://www.cnblo ...
- JS 面向对象 ~ 创建对象的 9 种方式
一.创建对象的几种方式 1.通过字面量创建 var obj = {};这种写法相当于:var obj = new Object(); 缺点:使用同一个接口创建很多单个对象,会产生大量重复代码 2.通过 ...
- Spring创建对象的三种方式以及创建时间
创建对象的三种方式: 1.采用默认的构造函数创建 2.采用静态工厂方法 1.写一个静态工厂方法类 public class HelloWorldFactory { public static Hell ...
- Java中创建对象的四种方式
为什么80%的码农都做不了架构师?>>> Java中创建对象的四种方式 (1) 用new语句创建对象,这是最常见的创建对象的方法. (2) 运用反射手段,调用java.l ...
- C++创建对象的两种方式
C++创建对象有两种方式,在栈上创建对象(Objects on the Stack)和在堆上创建对象(Objects on the Heap). 假设我们有以下的类: 1 #include <s ...
- spring入门:beans.xml不提示、别名、创建对象的三种方式
spring的版本是2.5 一.beans.xml文件不提示 Location:spring-framework-2.5.6.SEC01\dist\resources\spring-beans-2.5 ...
- 课程介绍 复习 创建对象的三种方式 自定义构造函数创建对象 工厂模式创建对象
课程介绍 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8 ...
- Javascript创建对象的几种方式?
javascript 中常见的创建对象的几种方式: 1. 使用Object构造函数创建: 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的属性 ...
- IoC、Spring 环境搭建、Spring 创建对象的三种方式、DI
二.IoC 中文名称:控制反转 英文名称:(Inversion of Control) 3.I oC 是什么? 3.1 IoC 完成的事情原先由程序员主动通过 new 实例化对象事情,转交给 Spri ...
最新文章
- corosync+pacemaker+crm简单配置
- 了解你所不知道的SMON功能(十二):Shrink UNDO(rollback) SEGMENT
- Eclipse常见问题集锦
- 巴西队被打成了蜂窝煤
- 推荐几款爬虫软件与无需编程的数据分析工具
- 【收藏】请不要做浮躁的人
- git-合并分支指定commits
- qt中将数据库中的数据显示
- gradle教程java_Gradle教程系列 ——Gradle基本语法
- 解决ps图层不能填充问题
- 超全!我常用的70个数据分析网址
- 金税盘没有及时清卡怎么办
- 使用Pandas读取CSV文件:sep操作
- 【ArcGIS】空间表无法删除的问题处理
- 计算机专业对数学英语要求高吗,大学专科计算机专业对英语数学的要求高么
- BUUCTF [GYCTF2020] Blacklist
- Android学习之手机传感器的获取
- win10系统安装与双系统ubuntu深度学习环境配置
- Mycat-配置详解
- 软考复习之第一部分计算机组成原理