c++基础练习

  • 构造和析构的基础知识
  • 构造和析构的演示
    • 构造函数的分类
    • 构造和析构的综合练习
    • 构造函数调用规则研究
  • copy构造函数的调用时机
    • copy构造函数
    • 拷贝构造函数的第四种应用场景
  • 构造函数的调用规则
  • 浅拷贝和深拷贝分析
  • 构造函数的初始化列表
  • new 和 delete 的用法
    • 基本语法
    • 深入分析
  • 静态成员变量和静态成员函数
  • this 指针

构造和析构的基础知识

对象的构造和析构
1.创建一个对象需要做初始化工作
构造函数
1)c++中的类可以定义和类同名的特殊成员函数,这种于类名相同的成员函数叫做析构函数
2)构造函数在定义时可以有参数
2)没有任何返回类型的声明
2.调用
自动
手动

析构函数
声明周期结束后自动调用
先创建的对象后释放

#include <iostream>class Test
{public:Test();void printP(void);~Test();private:int a;char* p;
};Test::Test()
{a = 10;p = (char*)malloc(100);strcpy(p, "aaafffafa");std::cout << "我是构造函数" << std::endl;
}void Test::printP(void)
{std::cout << a << std::endl;std::cout << p << std::endl;
}Test::~Test()
{if (p != NULL){free(p);}std::cout << "我是析构函数,我被调用了" << std::endl;
}void objplay()
{Test t1;t1.printP();std::cout << "先创建的对象后释放" << std::endl;Test t2;t2.printP();
}int main()
{objplay();std::cout << "Hello World!\n";
}

构造和析构的演示

#include <iostream>class Test
{public:Test();void printP(void);~Test();private:int a;char* p;
};Test::Test()
{a = 10;p = (char*)malloc(100);strcpy(p, "aaafffafa");std::cout << "我是构造函数" << std::endl;
}void Test::printP(void)
{std::cout << a << std::endl;std::cout << p << std::endl;
}Test::~Test()
{if (p != NULL){free(p);}std::cout << "我是析构函数,我被调用了" << std::endl;
}void objplay()
{Test t1;t1.printP();std::cout << "先创建的对象后释放" << std::endl;Test t2;t2.printP();
}int main()
{objplay();std::cout << "Hello World!\n";return 0;
}

构造函数的分类

#include <iostream>class Test2
{public:Test2();Test2(int a);Test2(int a, int b);Test2(const Test2& obj);void printT(void);~Test2();private:int m_a;int m_b;
};Test2::Test2()
{m_a = 0;m_b = 0;std::cout << "无参构造函数" << std::endl;
}Test2::Test2(int a)
{m_a = a;m_b = 0;std::cout << "无参构造函数" << std::endl;
}Test2::Test2(int a, int b)
{m_a = a;m_b = b;std::cout << "有参构造函数" << std::endl;
}Test2::Test2(const Test2& obj)
{std::cout << "我也是构造函数" << std::endl;
}void Test2::printT(void)
{std::cout << "我是普通成员函数" << std::endl;
}Test2::~Test2()
{}void objplay2()
{Test2 t1;t1.printT();Test2 t2(1, 2);t2.printT();Test2 t3 = (1, 2);t3.printT();Test2 t4 = Test2(1, 2);t4.printT();}int main2()
{objplay2();std::cout << "Hello World!\n";return 0;
}

构造和析构的综合练习

#include <iostream>class ABCD
{public:ABCD(int a, int b, int c);~ABCD();
public:int getA();private:int a;int b;int c;
};ABCD::ABCD(int a, int b, int c)
{this->a = a;this->b = b;this->c = c;std::cout << "ABCD() construct,a:" << this->a << "b:" << this->b << "c:" << this->c << std::endl;
}ABCD::~ABCD()
{std::cout << "~ABCD() construct,a:" << this->a << "b:" << this->b << "c:" << this->c << std::endl;
}int ABCD::getA()
{return this->a;
}class MyE
{public:MyE();MyE(const MyE& obj);~MyE();public:ABCD abcd1;ABCD abcd2;const int m;
private:
};MyE::MyE() :abcd1(1, 2, 3), abcd2(4, 5, 6), m(100)
{}MyE::MyE(const MyE& obj) : abcd1(7, 8, 9), abcd2(10, 11, 12), m(100)
{std::cout << "MyE(const My & obj)" << std::endl;
}MyE::~MyE()
{std::cout << "MyE()" << std::endl;
}int doThing(MyE mye1)
{std::cout << "doThing() mye1.abc1.a" << mye1.abcd1.getA() << std::endl;return 0;
}int run2()
{MyE myE;doThing(myE);return 0;
}int run3()
{std::cout << "run3 start.." << std::endl;//ABCD(400, 500, 600);ABCD abcd = ABCD(100, 200, 300);std::cout << "run3 end.." << std::endl;return 0;
}int main3311()
{//run2();run3();std::cout << "Hello World" << std::endl;return 0;
}

构造函数调用规则研究

#include <iostream>class Test_1
{public:Test_1();Test_1(int a, int b);Test_1(const Test_1& obj);void printT();private:int m_a;int m_b;
};Test_1::Test_1()
{m_a = 0;m_b = 0;
}Test_1::Test_1(int a, int b)
{m_a = a;m_b = b;
}Test_1::Test_1(const Test_1& obj)
{m_a = obj.m_a;m_b = obj.m_b;
}void Test_1::printT()
{}void object_play24()
{Test_1 t1;
}int main621()
{object_play24();std::cout << "Hello World!\n";return 0;
}

copy构造函数的调用时机


#include <iostream>class Test4
{public:Test4();Test4(int a, int b);Test4(const Test4& obj);void printT();~Test4();private:int m_a;int m_b;
};Test4::Test4()
{m_a = 0;m_b = 0;std::cout << "我是构造函数" << std::endl;
}Test4::Test4(int a, int b)
{m_a = a;m_b = b;
}Test4::Test4(const Test4& obj)
{std::cout << "我也是构造函数" << std::endl;m_a = obj.m_a + 100;m_b = obj.m_b + 100;
}void Test4::printT()
{std::cout << "我是普通成员函数" << std::endl;std::cout << "m_a: " << m_a << std::endl;std::cout << "m_b: " << m_b << std::endl;
}Test4::~Test4()
{std::cout << "我是析构函数" << std::endl;
}int main4()
{Test4 t1(1, 2);Test4 t0(1, 2);t0 = t1;/*Test4 t2 = t1;t2.printT();*/Test4 t2(t1);t2.printT();std::cout << "Hello World!\n";return 0;
}

copy构造函数

#include <iostream>class Location
{public:Location(int x = 0, int y = 0);Location(const Location& obj);~Location();public:int getX();int getY();private:int m_x;int m_y;
};Location::Location(int x, int y)
{m_x = x;m_y = y;std::cout << "Constructor Object." << std::endl;
}Location::Location(const Location& obj)
{m_x = obj.m_x;m_y = obj.m_y;
}int Location::getX()
{return m_x;
}int Location::getY()
{return m_y;
}Location::~Location()
{std::cout << "Object Destroyed." << std::endl;
}void f(Location p)
{std::cout << p.getX() << std::endl;std::cout << p.getY() << std::endl;
}void object_play()
{Location a(1, 2);Location b = a;f(b);//b实参去初始化p,会调用拷贝构造函数
}int main5()
{object_play();std::cout << "Hello World!\n";return 0;
}

拷贝构造函数的第四种应用场景

#include <iostream>class Location1
{public:Location1(int x = 0, int y = 0);Location1(const Location1& obj);~Location1();public:int getX();int getY();private:int m_x;int m_y;
};Location1::Location1(int x, int y)
{m_x = x;m_y = y;std::cout << "Constructor Object." << std::endl;
}Location1::Location1(const Location1& obj)
{m_x = obj.m_x;m_y = obj.m_y;
}int Location1::getX()
{return m_x;
}int Location1::getY()
{return m_y;
}Location1::~Location1()
{std::cout << "Object Destroyed." << std::endl;
}void f(Location1 p)
{std::cout << p.getX() << std::endl;std::cout << p.getY() << std::endl;
}//返回一个元素
Location1 g()
{Location1 A(1, 2);return A;
}void object_play21()
{g();
}void object_play22()
{Location1 m = g();//匿名对象不析构  初始化
}void object_play23()
{Location1 m2(1, 2);m2 = g();//匿名对象 被析构  赋值
}int main61()
{object_play23();std::cout << "Hello World!\n";return 0;
}

构造函数的调用规则

#include <iostream>class Test_1
{public:Test_1();Test_1(int a, int b);Test_1(const Test_1& obj);void printT();private:int m_a;int m_b;
};Test_1::Test_1()
{m_a = 0;m_b = 0;
}Test_1::Test_1(int a, int b)
{m_a = a;m_b = b;
}Test_1::Test_1(const Test_1& obj)
{m_a = obj.m_a;m_b = obj.m_b;
}void Test_1::printT()
{}void object_play24()
{Test_1 t1;
}int main621()
{object_play24();std::cout << "Hello World!\n";return 0;
}

浅拷贝和深拷贝分析

#include <iostream>class Name
{public:Name();Name(const char *my);Name(const Name& obj);~Name();private:char* p;int len;
};Name::Name()
{p = NULL;len = 0;
}Name::Name(const char* myp)
{len = strlen(myp);myp = (char*)malloc(len + 1);strcpy(p, myp);
}Name::Name(const Name& obj)
{len = obj.len;p = (char*)malloc(len + 1);strcpy(p, obj.p);
}Name::~Name()
{if (p != NULL){free(p);p = NULL;len = 0;}
}void obj_play_y()
{Name obj1("asodfa");Name obj2 = obj1;Name obj3("obj3");obj3 = obj1;  //浅拷贝  等号赋值  显示重载等号操作符
}int main27()
{obj_play_y();std::cout << "Hello World" << std::endl;return 0;
}

构造函数的初始化列表

#include <iostream>class A
{public:A(int  _a);~A();private:int a;
};A::A(int _a)
{a = _a;std::cout << "构造函数a:" << a << std::endl;
}A::~A()
{std::cout << "析构函数a:" << a << std::endl;
}class B
{public:B(int _b1, int _b2, int m, int n);~B();private:int b1;int b2;A a1;A a2;const int c;
};B::B(int _b1, int _b2, int m, int n) : a1(m), a2(n) , c(0)
{b1 = _b1;b2 = _b2;}B::~B()
{std::cout << "析构函数B:" << std::endl;
}void playObj()
{//参数传递;B objB(1, 2, 3, 4);//调用顺序// 构造函数  如果子和对象有多个,按照定义顺序 不是初始化列表顺序// 析构函数  和构造函数相反
}int main190()
{playObj();std::cout << "Hello World" << std::endl;return 0;
}

new 和 delete 的用法

基本语法

#include <iostream>int main1301()
{int* a = (int*)malloc(sizeof(int));*a = 10;//int* p = new int;*p = 20;free(p);int *p1 = new int(30);delete p1;std::cout << "Hello World" << std::endl;return 0;
}
//分配数组
int main1302()
{int* p = (int*)malloc(sizeof(int) * 10); //int array[10];p[0] = 1;free(p);//c++ 分配数组int* pArray = new int[10];pArray[1] = 2;delete[] pArray; //数组加[]std::cout << "Hello World" << std::endl;return 0;
}class MyTest
{public:MyTest(int a);~MyTest();private:int a;
};MyTest::MyTest(int a)
{this->a = a;std::cout << "构造函数执行" << std::endl;
}MyTest::~MyTest()
{std::cout << "析构函数执行" << std::endl;
}//分配对象
int main13221()
{//c 语言MyTest* pT1 = (MyTest*)malloc(sizeof(MyTest));free(pT1);//c++MyTest* pT2 = new MyTest(10);delete pT2;std::cout << "Hello World" << std::endl;return 0;
}

深入分析

#include <iostream>int main13021()
{int* a = (int*)malloc(sizeof(int));*a = 10;//int* p = new int;*p = 20;delete p;//free(p);int* p1 = new int(30);delete p1;std::cout << "Hello World" << std::endl;return 0;
}
//分配数组
int main122321()
{int* p = (int*)malloc(sizeof(int) * 10); //int array[10];p[0] = 1;//free(p);delete[] p;//c++ 分配数组int* pArray = new int[10];pArray[1] = 2;//delete[] pArray; //数组加[]delete[] pArray;std::cout << "Hello World" << std::endl;return 0;
}class MyTest1
{public:MyTest1(int a);~MyTest1();private:int a;
};MyTest1::MyTest1(int a)
{this->a = a;std::cout << "构造函数执行" << std::endl;
}MyTest1::~MyTest1()
{std::cout << "析构函数执行" << std::endl;
}//分配对象
int main1401()
{//c 语言MyTest1* pT1 = (MyTest1*)malloc(sizeof(MyTest1));delete(pT1);//c++MyTest1* pT2 = new MyTest1(10);free(pT2);std::cout << "Hello World" << std::endl;return 0;
}

静态成员变量和静态成员函数

#include <iostream>class BB
{public:BB();~BB();
public:int getC();static void getCC();int AddC();private:int a;int b;static int c;
};BB::BB()
{}BB::~BB()
{}int BB::getC()
{return c;
}void BB::getCC()
{std::cout << "c:" << c << std::endl;
}int BB::AddC()
{return c++;
}int BB::c = 10;int main123346534()
{BB b1, b2, b3;std::cout << b1.getC() << std::endl;b2.AddC();std::cout << b3.getC() << std::endl;b3.getCC();BB::getCC();std::cout << "Hello World" << std::endl;return 0;
}

this 指针

#include <iostream>class TTest
{public:TTest(int a, int b);  //Test(Test* this, int a, int b)~TTest();
public:void printT();private:int a;int b;
};TTest::TTest(int a, int b)
{this->a = a;this->b = b;
}TTest::~TTest()
{}void TTest::printT()
{std::cout << "a" << a << std::endl;std::cout << "b" << b << std::endl;
}int main113322()
{TTest tt1(1, 2);tt1.printT();std::cout << "Hello World" << std::endl;return 0;
}

c++基础day03相关推荐

  1. Python基础day03 作业解析【5道 字符串题、3道 列表题、2道 元组题】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day03[字符串(定义.输入输出.常用方法).列表(定义.基本使用.增删改查.嵌 ...

  2. Python基础day03【字符串(定义、输入输出、常用方法)、列表(定义、基本使用、增删改查、嵌套)、元组】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day3 作业解析[5道 字符串题.3道 列表题.2道 元组题]      学习目 ...

  3. PS基础-day03选区,自由变化

    选区工具(M) 选区的作用 ①可以对选区内部进行填充(颜色,图案) ②可以删除选区里面的内容 ③可以对选区内部进行复制(抠图)+复制(CTRL+J) 取消选区:CTRL+D/鼠标右键取消选区 填充选区 ...

  4. Python 十六进制转Base64_python基础day03笔记

    嗨,大家上午好,今天又是分享笔记的一天,希望大家多多关注,谢谢. 希望大家喜欢,多关注,谢谢! 字符串str 作用: 用来记录文本(文字)信息 字符串的表示方式: 在非注释中,凡是用引号括起来的部分都 ...

  5. 小汤学编程之JAVA基础day03——运算符

    一.赋值运算符 1.赋值      2.特点     3.书写格式 二.算术运算符 1.基本运算符      2.复合运算符 三.关系运算符 四.逻辑运算符 五.条件运算符 六.位运算符 七.运算符的 ...

  6. PS基础-day03套索,魔棒,裁剪,修复画笔工具组,蒙版

    套索(L) 创建不规则选区和矩形选区工具组的功能是一样的 套索工具绘制自由选区,直接鼠标左键自由绘制 多边形套索工具:通过鼠标左键绘制直线选区(回退键backspace)可以回退到上一步选区命令,es ...

  7. Java基础 DAY03

    运算符是一种特殊的符号,用以表示数据的运算.赋值和比较等. 算术运算符 算术运算符是对数值类型的变量进行运算的. /*** 演示算术运算符的使用 */ public class ArithmeticO ...

  8. 第十七周-day71-Python编程基础day03

    老男孩教育-张导博客:https://www.cnblogs.com/Neeo/articles/11204572.html 1. 字符串基本操作 # 按索引取值s = 'abcdef' print( ...

  9. 字符串从右截取_跟运维组学Python基础day04(字符串str的索引和切片)

    内容回顾 跟运维组学Python基础 day03 格式化输出 %s name = input('Pleases input your name: ') # Zanaoprint('My name is ...

最新文章

  1. 【FFmpeg】ffmpeg中函数返回的错误码:AVERROR及AVERROR_*
  2. python aipspeech_Python调用百度API实现语音识别(二)
  3. UBuntu14.04下安装和卸载Qt5.3.1
  4. hdu 5112 A Curious Matt
  5. 网摘--2014年5月12日
  6. freemaker模板引擎使用详解
  7. 计算机无法使用光驱启动,电脑BIOS怎么设置光盘启动 三种类型BIOS设置光驱启动的图文详解教程...
  8. java timer开销_减少Java垃圾收集开销的5条提示
  9. Python绘制直方图案例一则
  10. Eureka、Zookeeper、Consul异同点
  11. python自动补全快捷键_Python快捷键的干货来啦!快来看看你掌握了几个~
  12. 彻底了解Cookie
  13. Usb rndis,mtp等function添加,config配置
  14. 京东平台和商家的不同合作模式
  15. 先广度后深度,打开编程视野
  16. 排序(基于Java语言编写)
  17. 转:传说中破解基础----背的滚瓜烂熟差不多就会破解
  18. Doc批量转成Docx
  19. sessionStorage存储数据和取数据
  20. 中国邮件群发服务商现状分析

热门文章

  1. Apache Doris : 一个开源 MPP 数据库的架构与实践
  2. spark.mllib:GradientBoostedTrees
  3. 分布式系统中的一致性协议
  4. Spring Boot 常见面试题
  5. 深入理解ThreadLocal
  6. 【原创 HadoopSpark 动手实践 6】Spark 编程实例与案例演示
  7. MS SQL巡检系列mdash;mdash;检查重复索引
  8. V-3-3 在没有vCenter的情况下,复制虚拟机
  9. Linux常用命令总结之(五)alias
  10. Symfony2模版引擎使用说明手册