• 不通过“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++创建对象的几种方式相关推荐

  1. 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...

  2. Java中创建对象的几种方式

    Java中创建对象的几种方式 1.使用new创建对象,在堆上创建. 2.克隆 3.反序列化 4.反射创建对象 5.NIO中可以使用本地方法直接分配堆外内存. 转载于:https://www.cnblo ...

  3. JS 面向对象 ~ 创建对象的 9 种方式

    一.创建对象的几种方式 1.通过字面量创建 var obj = {};这种写法相当于:var obj = new Object(); 缺点:使用同一个接口创建很多单个对象,会产生大量重复代码 2.通过 ...

  4. Spring创建对象的三种方式以及创建时间

    创建对象的三种方式: 1.采用默认的构造函数创建 2.采用静态工厂方法 1.写一个静态工厂方法类 public class HelloWorldFactory { public static Hell ...

  5. Java中创建对象的四种方式

    为什么80%的码农都做不了架构师?>>>    Java中创建对象的四种方式 (1) 用new语句创建对象,这是最常见的创建对象的方法.    (2) 运用反射手段,调用java.l ...

  6. C++创建对象的两种方式

    C++创建对象有两种方式,在栈上创建对象(Objects on the Stack)和在堆上创建对象(Objects on the Heap). 假设我们有以下的类: 1 #include <s ...

  7. spring入门:beans.xml不提示、别名、创建对象的三种方式

    spring的版本是2.5 一.beans.xml文件不提示 Location:spring-framework-2.5.6.SEC01\dist\resources\spring-beans-2.5 ...

  8. 课程介绍 复习 创建对象的三种方式 自定义构造函数创建对象 工厂模式创建对象

    课程介绍 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8 ...

  9. Javascript创建对象的几种方式?

    javascript 中常见的创建对象的几种方式: 1. 使用Object构造函数创建: 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的属性 ...

  10. IoC、Spring 环境搭建、Spring 创建对象的三种方式、DI

    二.IoC 中文名称:控制反转 英文名称:(Inversion of Control) 3.I oC 是什么? 3.1 IoC 完成的事情原先由程序员主动通过 new 实例化对象事情,转交给 Spri ...

最新文章

  1. corosync+pacemaker+crm简单配置
  2. 了解你所不知道的SMON功能(十二):Shrink UNDO(rollback) SEGMENT
  3. Eclipse常见问题集锦
  4. 巴西队被打成了蜂窝煤
  5. 推荐几款爬虫软件与无需编程的数据分析工具
  6. 【收藏】请不要做浮躁的人
  7. git-合并分支指定commits
  8. qt中将数据库中的数据显示
  9. gradle教程java_Gradle教程系列 ——Gradle基本语法
  10. 解决ps图层不能填充问题
  11. 超全!我常用的70个数据分析网址
  12. 金税盘没有及时清卡怎么办
  13. 使用Pandas读取CSV文件:sep操作
  14. 【ArcGIS】空间表无法删除的问题处理
  15. 计算机专业对数学英语要求高吗,大学专科计算机专业对英语数学的要求高么
  16. BUUCTF [GYCTF2020] Blacklist
  17. Android学习之手机传感器的获取
  18. win10系统安装与双系统ubuntu深度学习环境配置
  19. Mycat-配置详解
  20. 软考复习之第一部分计算机组成原理

热门文章

  1. 有什么可以快速剪切音乐的工具
  2. c语言实现对日历的输出
  3. 计算机二级和初级的区别
  4. Linux 安装Zabbix5.0超详细教程
  5. B2B2C多商户系统功能丰富,极易二开
  6. Docker 学习3
  7. java 输入字符_java中如何输入一个字符
  8. 【附源码】Python计算机毕业设计猫眼电影购票网
  9. 2020前端面试真题( HTML + CSS )
  10. Java web基础加强笔记 品诗押韵好记忆 系列