explicit关键字:防止构造函数隐式类型转换

#include  <iostream>
#include "pch.h"
using namespace std; class Person1 {
public:
explicit Person1( int a) {//防止隐式构造函数的使用
num = a;
}
int num;
};
void test01() {
//Person1 p1(10);//隐式类型转换,就是Person p1=Person(10),调用的是有参构造函数,默认是使用隐式构造函数
  //如果使用了explicit的话,那么不能隐式类型转换
  Person1 p1(); }
int main() {
test01();
}

运算符:new(重要):分配内存空间,delete释放内存空间

函数:malloc

new的运算符里,当用new创建对象的时候,它在堆区为对象分配内存并调用构造函数完成初始化,delete释放空间

Person1* person = new  Person1;
相当于
Person1* person = (Person1*)malloc * (sizeof(Person1));//Person1*强转
if (person == Null) {
return ;
}
person->Init();//构造函数
new操作符可以确定在调用构造哈数之前内存分配是成功的,所有不用显式确定调用是否成功

栈区开辟:Person  p1

堆区开辟:Person p2=new  Person;  释放delete  p2;(重要)

#include "pch.h"
#include <iostream>
using namespace std; class Person {
public:
Person() {
cout << "无参构造函数" << endl;
} Person(int a) { }
~Person()
{
cout << "析构函数调用" << endl;
}
}; //第一种
void test01() {
//Person p1;//栈区开辟 Person* p2 = new Person;//堆区开辟
//所有new出来的对象,都会返回该类型的指针,上面的是person,那就返回person类型的指针,运算符号
//malloc会返回void*,还要进行强转
//malloc不会调用构造函数,new会调用函数,malloc是一个函数,new是一个运算符 //释放堆区的空间、
delete p2;//也就是释放析构的过程,逆序,delete也是一个运算符,malloc配合free来使用
} //第二种
void test02() {
//当void*接收new出来的指针,会出现释放的问题
void* p2 = new Person;
delete p2;//使void*不会释放p2(析构函数)
} //第三种
void test03() { //通过new来开辟数组
Person * p3 =new Person[];//当有多个person对象的时候,前面要加*,开辟多个person对象出来
//new开辟数组的话,一定会使用默认构造函数,如果没有默认构造函数的话,就会报错,所以一定要提供默认构造函数 //在栈上面开辟数组的话,可以没有默认构造函数,指定的是有参构造函数
//Person p4[2] = { Person(3),Person(5) };//栈上开辟数组的话,可以不用有默认构造 //释放数组,一定要加上一个[],指针指向的内存空间是否存在一个数组记录大小记录
delete [] p3;//加[]的目的是是记录数组大小记录,告诉他,有多少个对象数据,那么这个delete就知道几个对象数组,并且调用调用几次析构函数
}
int main(
) { //test01();
//test02();
test03();
}
//使用new运算符来堆区开辟的话,一定会使用默认构造函数的,所以一定要提供默认构造函数

没有delete释放之前(new):

释放堆区数组之后,释放数组要加[],这样才知道要释放多少个对象数据,其他情况不用,delete  []   p3;

总结:

new运算符:

Person *p=new Person;会返回一个Person指针
默认调用构造函数,开辟空间,返回的不是void * ,不需要强制转换
delete运算符释放
new对象用void*去接收,释放不了对象
new出来的数组的话,释放的话,delete [] xxx;
new出来的是数组,肯定会调用默认构造

malloc函数:
malloc:返回的是void*,不会调用构造函数

C++入门篇九的更多相关文章

  1. spring boot(一):入门篇

    构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...

  2. PC游戏编程(入门篇)(前言写的很不错)

    PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 ...

  3. 前端向后台的华丽转身 — PHP入门篇

    三个月就这么悄悄溜走了,本K对于前端虽然有了一定的认识,但对一些方面还是处于一种比较萌币的状态,就在这种萌币状态下,本K又跟着大神浩开始了后台语言-PHP语言的学习.PHP的学习对于学过其他语言的人来 ...

  4. Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码

    Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习MapReduce时的一些 ...

  5. VBScript入门篇

    VBScript入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.定义一个过程 定义一个过程:可以将相同的操作的代码提取出来,方便其他人来调用这段代码,可以减少你的代码的重 ...

  6. 【Android开发日记】之入门篇(十二)——Android组件间的数据传输

    组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...

  7. 每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30分钟手把手教你学webpack实战 vue.js+webpack模块管理及组件开发

    每天记录一点:NetCore获得配置文件 appsettings.json   用NetCore做项目如果用EF  ORM在网上有很多的配置连接字符串,读取以及使用方法 由于很多朋友用的其他ORM如S ...

  8. Python入门篇-文件操作

    Python入门篇-文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.文件IO常用操作 open:打开 read:读取 write:写入 close:关闭 readlin ...

  9. Membership三步曲之入门篇 - Membership基础示例

    Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 -  Membership基础示例 Membership三步曲之进阶篇 -  深入剖析Pro ...

随机推荐

  1. Net包管理NuGet(4)打包nuget包的进阶用法

    nuget包不止可以放进dll,还可以引用其他包,创建项目文件及替换配置文件 引用的时候同时引用依赖项假设引用某个dll需要依赖其他的dll如Zeta.Core.dll需要引用ZETA.Seriali ...

  2. Linux(Ubuntu)使用日记------部署JavaWeb项目到服务器

    0.前言 本博文内容是建立在你可以通过SSH连接到远程服务器的基础上的,如果你还没有用SSH连接到远程服务器,请参考此文(腾讯云服务器): http://www.cnblogs.com/hwtblog ...

  3. list遍历时删除的坑

    1.测试代码如下: public class StrTest { public static void main(String[] args) { ArrayList<String> li ...

  4. Vue.js 2.x笔记:安装与起步(1)

    1. 环境准备 Vue是一套用于构建用户界面的渐进式框架,设计为可以自底向上逐层应用.Vue 的核心库只关注视图层. 安装Node.js,下载:https://nodejs.org/ 查看安装: $ ...

  5. 2019-04-18 Beetl模板学习

    1. beetl的安装 使用maven: <dependency> <groupId>com.ibeetl</groupId> <artifactId> ...

  6. DELPHI中build和compile有什么区别?

    Build编译全部与工程相关联的文件,可包括版本信息及工程中的预编译变量等:Compile只重新编译更改过的相关单元及文件,调试是Compile就可以了,若是发布,则Build为好 BUILD  =C ...

  7. npm 安装包失败 --- 清除npm缓存

    今天同事给了一个webpack的项目,我拿过来,npm  install 突然出现报错了,并且报了一个奇怪的错误, 如下所示, Unexpected end of JSON input while p ...

  8. How To Configure NetScaler AppFlow for SolarWinds

    How To Configure NetScaler AppFlow for SolarWinds 来源  https://support.citrix.com/article/CTX227300 A ...

  9. Java实验报告

    package sadsada; import java.util.Scanner; import java.util.Arrays; public class student { public st ...

  10. Python与微信——itchat包

    目录 itchat itchat 一安装itchat pip install itchat pip install echarts-python 二登陆并向文件传输助手发消息 import itcha ...