zoukankan      html  css  js  c++  java
  • c++-构造函数练习和delete,new

    强化练习

    
    #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		 
    ", _a, _b, _c);
    	}
    	~ABCD()
    	{
    		printf("~ABCD()	construct,a: %d,b: %d,c: %d		 
    ", _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) 
    ");
    	}
    public:
    	ABCD	abcd1;	 //c++编译器不知道如何构造abc1
    	ABCD	abcd2;
    	const int	m;
    };
    
    int	doThing(MyE	mye1)//mye1.拷贝构造(main::myE)
    {
    	printf("doThing()	mye1.abc1.a: %d 
    ", mye1.abcd1.getA());
    	return 0;
    }
    int	run()
    {
    	MyE	myE;
    	doThing(myE);
    	return 0;
    }
    
    int	run2()
    {
    	printf("run2	start.. 
    ");
    	//ABCD(400, 500, 600);	 //临时对象的⽣命周期		
    	ABCD	abcd	=	ABCD(100,	200,	300);
    	printf("run2	end
    ");
    	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
    ", _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
    ", 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("
    ");
    
    	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;
    }
    
  • 相关阅读:
    stm32 单片机
    #pragma hdrstop
    #pragma预处理命令
    用define 宏定义注释符号
    ANSI 标准C 还定义了如下几个宏
    国际C 语言乱码大赛(IOCCC )
    深入浅出C语言中的柔性数组
    有符号数与无符号数之间运算问题
    c 语言 register 关键字
    Windows堆思维导图--Windows pro sp3
  • 原文地址:https://www.cnblogs.com/ygjzs/p/12076503.html
Copyright © 2011-2022 走看看