• c++创建对象的几种方式


    • 不通过“new”关键字,在栈上创建
    • 通过关键字“new”,在堆上创建

    两种方式的区别

    在栈中的对象,其作用范围只是在函数内部,函数执行完成后就会调用析构函数,删除该对象使用 “.” 而不是 “->” 调用对象的方法。

    在堆中的对象,必须要程序员手动的去管理该对象的内存空间 。用运算符“->”调用对象的方法。new出来的对象必须用指针指明地址。

    例子:

     (1)无参构造函数:

    1. #include
    2. using namespace std;
    3. class Line
    4. {
    5. public:
    6. void setLength( double len );
    7. double getLength( void );
    8. Line(); // 这是构造函数
    9. private:
    10. double length;
    11. };
    12. // 成员函数定义,包括构造函数
    13. Line::Line(void)
    14. {
    15. cout << "Object is being created" << endl;
    16. }
    17. void Line::setLength( double len )
    18. {
    19. length = len;
    20. }
    21. double Line::getLength( void )
    22. {
    23. return length;
    24. }
    25. // 程序的主函数
    26. int main( )
    27. {
    28. Line line;
    29. // 设置长度
    30. line.setLength(6.0);
    31. cout << "Length of line : " << line.getLength() <
    32. return 0;
    33. }

    结果:

    Object is being created
    Length of line : 6

    (2)有参构造函数

    1. #include
    2. using namespace std;
    3. class Line
    4. {
    5. public:
    6. void setLength( double len );
    7. double getLength( void );
    8. Line(double len); // 这是构造函数
    9. private:
    10. double length;
    11. };
    12. // 成员函数定义,包括构造函数
    13. Line::Line( double len)
    14. {
    15. cout << "Object is being created, length = " << len << endl;
    16. length = len;
    17. }
    18. void Line::setLength( double len )
    19. {
    20. length = len;
    21. }
    22. double Line::getLength( void )
    23. {
    24. return length;
    25. }
    26. // 程序的主函数
    27. int main( )
    28. {
    29. Line line(10.0);
    30. // 获取默认设置的长度
    31. cout << "Length of line : " << line.getLength() <
    32. // 再次设置长度
    33. line.setLength(6.0);
    34. cout << "Length of line : " << line.getLength() <
    35. return 0;
    36. }

    结果:

    Object is being created, length = 10
    Length of line : 10
    Length of line : 6

    (3)new来创建

    1. // 对于对象
    2. class TestNew
    3. {
    4. private:
    5. int ID;
    6. public:
    7. TestNew(int ID);
    8. ~TestNew();
    9. };
    10. TestNew::TestNew(int ID)
    11. {
    12. this->ID = ID;
    13. }
    14. TestNew::~TestNew()
    15. {
    16. std::cout<<"对象 "<<this->ID<<" 执行析构函数"<
    17. delete ;
    18. }
    19. void Test()
    20. {
    21. TestNew test(1);//创建对象1,不使用new
    22. TestNew *pTest = new TestNew(1);//创建对象2,使用new
    23. delete pTest; // new的东西记得删除
    24. }
    25. int main()
    26. {
    27. Test();
    28. }

    结果:

    再来一个例子 

    1. #include
    2. using namespace std;
    3. class test {
    4. public:
    5. void print(int n) {
    6. cout << "This is t" << n << "." << endl;
    7. }
    8. };
    9. int main() {
    10. test t1; //在栈(stack)上分配空间
    11. test t2 = test(); //也是在栈(stack)上分配空间
    12. test* t3 = new test(); //在堆(heap)上分配空间
    13. test* t4; //只是声明,还没有分配空间
    14. t1.print(1);
    15. t2.print(2);
    16. t3->print(3);
    17. delete t3;
    18. return 0;
    19. }

    This is t1.
    This is t2.
    This is t3. 

     

    现在总结一下静态对象

     (1)全局静态对象在程序执行 main() 之前已经分配好存储空间 ,在 main() 执行完成后进行释放。

    1. #include "fstream"
    2. #include "string"
    3. using namespace std;
    4. void writeMessageToFile(const string& msg)
    5. {
    6. ofstream ofs;
    7. ofs.open("test.txt", ios::app);
    8. ofs << msg << endl<
    9. ofs.close();
    10. }
    11. class TestClass
    12. {
    13. public:
    14. TestClass() { writeMessageToFile( "TestClass() 执行");}
    15. ~TestClass(){ writeMessageToFile("~TestClass() 执行"); }
    16. };
    17. static TestClass test;
    18. int main()
    19. {
    20. writeMessageToFile("main() 开始执行");
    21. //
    22. writeMessageToFile("main() 结束执行");
    23. return 0;
    24. }

     在这里插入图片描述

    (2)局部静态对象是从其所在函数第一次被调用时进行创建,直到整个程序结束才进行销毁;局部静态对象只有在第一次调用时进行初始化操作。

    1. #include "iostream"
    2. using namespace std;
    3. int main()
    4. {
    5. for (int i = 0; i < 5; ++i)
    6. {
    7. static int s = 0;
    8. s++;
    9. cout << s << endl;
    10. }
    11. system("pause");
    12. return 0;
    13. }

    在这里插入图片描述

  • 相关阅读:
    基于SpringBoot的植物健康系统
    网络基础入门:数据通信与网络基础
    java 常用包
    C Primer Plus(6) 中文版 第6章 C控制语句:循环 6.10 嵌套循环
    嵌入式Linux驱动开发 02:将驱动程序添加到内核中
    2024.3.12
    『忘了再学』Shell基础 — 19、使用declare命令声明变量类型
    数据结构——时间复杂度和空间复杂度
    新版WordPress插件短视频去水印小程序源码
    安信可IDE(AiThinker_IDE)编译ESP8266工程方法
  • 原文地址:https://blog.csdn.net/zhang2362167998/article/details/126456631