强化练习


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream>
using namespace std; class ABCD
{
public:
ABCD(int a, int b, int c)
{
_a = a;
_b = b;
_c = c;
printf("ABCD() construct, a: %d,b: %d,c: %d \n", _a, _b, _c);
}
~ABCD()
{
printf("~ABCD() construct,a: %d,b: %d,c: %d \n", _a, _b, _c);
}
int getA()
{
return _a;
}
private:
int _a;
int _b;
int _c;
}; class MyE
{
public: MyE() :abcd1(1, 2, 3), abcd2(4, 5, 6), m(100)
{
cout << "MyE()" << endl;
}
~MyE()
{
cout << "~MyE()" << endl;
} MyE(const MyE & obj) :abcd1(7, 8, 9), abcd2(10, 11, 12), m(100)
{
printf("MyD(const MyD & obj) \n");
}
public:
ABCD abcd1; //c++编译器不知道如何构造abc1
ABCD abcd2;
const int m;
}; int doThing(MyE mye1)//mye1.拷贝构造(main::myE)
{
printf("doThing() mye1.abc1.a: %d \n", mye1.abcd1.getA());
return 0;
}
int run()
{
MyE myE;
doThing(myE);
return 0;
} int run2()
{
printf("run2 start.. \n");
//ABCD(400, 500, 600); //临时对象的⽣命周期
ABCD abcd = ABCD(100, 200, 300);
printf("run2 end\n");
return 0;
} int main(void)
{
run2();
return 0;
}

强化练习2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream>
using namespace std; //构造中调⽤构造是危险的⾏为
class MyTest
{
public:
MyTest(int a, int b, int c)
{
_a = a;
_b = b;
_c = c;
}
MyTest(int a, int b)
{
_a = a;
_b = b;
MyTest(a, b, 100);//创建一个匿名对象
//
}
~MyTest()
{
printf("MyTest~: %d, %d, %d\n", _a, _b, _c);
}
int getC()
{
return _c;
}
void setC(int val)
{
_c = val;
} private:
int _a;
int _b;
int _c;
}; int main()
{
MyTest t1(1, 2);
printf("c: %d\n", t1.getC()); //请问c的值是?
return 0;
}
  • 对象的动态构造和释放

    • malloc free函数,new delete 操作符号
    • 分配基础类型 、分配数组类型、分配对象
    • new和malloc 深入分析,混用测试、异同比较
  • 匿名对象生命周期
  • malloc free函数,new delete 操作符号
  • 分配基础类型 、分配数组类型、分配对象
  • new和malloc 深入分析,混用测试、异同比较
  • 匿名对象总结
    • 匿名对象生命周期
    • 匿名对象去和留
    • 构造中调用构造
  • 匿名对象去和留
  • 构造中调用构造
  • 静态成员变量和静态成员函数(属于类,语法)

new和delete

c与c++的比较

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream> using namespace std; class Test
{
public:
Test()
{
cout << "Test()" << endl;
m_a = 0;
m_b = 0;
}
Test(int a, int b)
{
cout << "Test(int, int)" << endl;
m_a = a;
m_b = b;
}
void printT()
{ cout << "printT:"<<m_a<<","<<m_b << endl;
}
~Test()
{
cout << "~Test()" << endl; }
private:
int m_a;
int m_b;
}; //C语言中
void test1()
{
int *p = (int *)malloc(sizeof(int)); *p = 10;
if (p != NULL) {
free(p);
//delete p;
p = NULL;
} int *array_p = (int *)malloc(sizeof(int)* 10); for (int i = 0; i < 10; i++) {
array_p[i] = i + 1;
} for (int i = 0; i < 10; i++) {
printf("%d ", array_p[i]);
}
printf("\n"); if (array_p != NULL) {
free(array_p);
array_p = NULL;
} cout << "==============" << endl; Test *tp = (Test*)malloc(sizeof(Test));
tp->printT(); if (tp != NULL) {
free(tp);
tp = NULL;
}
} //malloc free 是函数,标准库,stdlib.h
//new 在堆上初始化一个对象的时候,会触发对象的构造函数。malloc不能
//free并不能触发一个对象的析构函数。
//C++中
void test2()
{
int *p = new int;
*p = 10;
if (p != NULL) {
free(p);
p = NULL;
} int *array_p = new int[10];
for (int i = 0; i < 10; i++) {
array_p[i] = i + 1;
} for (int i = 0; i < 10; i++) {
cout << array_p[i]<<" ";
}
cout << endl; if (array_p != NULL) {
delete [] array_p;
} cout << "==========" << endl;
//Test *tp = new Test(10, 20);//触发有参构造
Test *tp = new Test;//触发无惨构造
tp->printT();
if (tp != NULL) {
delete tp;
tp = NULL;
} } int main(void)
{
test1(); cout << "-----------" << endl; test2(); return 0;
}

c++-构造函数练习和delete,new的更多相关文章

  1. 合成的默认构造函数定义为delete的一种情况(针对C++11标准)

    1. 默认初始化 如果定义变量时没有指定初值,则变量会被默认初始化,此时变量被赋予了"默认值". 对于类类型的变量来说,初始化都是依靠构造函数来完成的.因此,即使定义某个类的变量( ...

  2. new 等于 malloc加构造函数

    1.new 是c++中的操作符,malloc是c 中的一个函数 2.new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员 ...

  3. 重载new和delete

    当我们创建一个new表达式时,会发生两件事.首先使用operator new()分配内存,然后调用构造函数.在delete表达式里,调用了析构函数,然后使用operator delete()释放内存. ...

  4. malloc/free和new/delete的异同

    一.基本概念 malloc/free: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返 ...

  5. C++—动态内存管理之深入探究new和delete

    C++中程序存储空间除栈空间和静态区外,每个程序还拥有一个内存池,这部分内存被称为自由空间(free store)或堆(heap).程序用堆来存储动态分配的对象,即,那些程序运行时分配的对象.动态对象 ...

  6. C++动态内存管理之深入探究new和delete

    C++中程序存储空间除栈空间和静态区外,每个程序还拥有一个内存池,这部分内存被称为自由空间(free store)或堆(heap).程序用堆来存储动态分配的对象,即,那些程序运行时分配的对象.动态对象 ...

  7. new malloc和delete free 的区别

    今天看了一个面试题:问new 和 malloc, delete 和 free 的区别,扭捏了半天,也没说完全:现总结如下: 1.先看看new 和 delete 看一个例子: <span styl ...

  8. new/new[]和delete/delete[]是如何分配空间以及释放空间的

    C++中程序存储空间除栈空间和静态区外,每个程序还拥有一个内存池,这部分内存被称为或堆(heap).程序可以用堆来存储动态分配的对象,即那些在程序运行时创建的对象.动态对象的生存期由程序来控制 ,当动 ...

  9. C++内存管理-new,delete,new[],placement new的简单使用

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 首先,我们先看一下C++应用程序,使用memory的途径如下图所示 C++应用程序中申请内存基于分配器的实现(std::allo ...

随机推荐

  1. Dart Learn Notes 02

    Functions Dart是一门面向对象的语言,所以即便是方法也是一个对象,它的类型是Function. 这就意味着方法可以指向变量,也可以作为方法中的参数供其他方法使用.甚至可以让 一个类作为一个 ...

  2. 【笔记】总结Springboot和Vue前后端分离的跨域问题

    跨域一直是个很玄学的问题,SSM的时候又得前后端一起配置,sb的时候又不用. 前端 axios普通get请求 submitForm() { var v=this; this.$axios({ meth ...

  3. 使用python删除N天前的文件

    python版本为:2.7 import os import sys import time # Sets how many days old files are deleted DAYS_N = 7 ...

  4. Flask入门学习——自定义一个url转换器

          我们知道,flask的url规则是可以添加变量部分的,这个参数变量是写在尖括号里的,比如:/item/<id>/,如果需要指出参数的类型要符合<converter:vai ...

  5. P1046 陶陶摘苹果

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出1010个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个3030厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在 ...

  6. 深入理解inode和硬链接和软连接和挂载点

    inode 一.inode是什么? 理解inode,要从文件储存说起. 扇区 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5 ...

  7. 环境变量PATH、cp命令、mv命令、文档查看cat/more/less/head/tail 各个命令的使用介绍

    第2周第2次课(3月27日) 课程内容: 2.10 环境变量PATH2.11 cp命令2.12 mv命令2.13 文档查看cat/more/less/head/tail 2.10 环境变量PATH P ...

  8. Netty学习——通过websocket编程实现基于长连接的双攻的通信

    Netty学习(一)基于长连接的双攻的通信,通过websocket编程实现 效果图,客户端和服务器端建立起长连接,客户端发送请求,服务器端响应 但是目前缺少心跳,如果两个建立起来的连接,一个断网之后, ...

  9. 关于c++函数里面return的用法,关于调用的讲解

    与下面的图片对比一下 可以看见在int b = test();d的时候cout<<"hello";就被调用了: cout<<b;只是返回return a的值 ...

  10. adb adb monkey命令及介绍

    1.adb的组成部分 守护进程,客户端,服务器端`      2.Monkey程序是Google公司提供的一个压力和稳定性测试的工具 3.命令 命令 参数 功能 adb version   查看当前a ...