C++入门篇九
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++入门篇九的更多相关文章
- spring boot(一):入门篇
构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...
- PC游戏编程(入门篇)(前言写的很不错)
PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 ...
- 前端向后台的华丽转身 — PHP入门篇
三个月就这么悄悄溜走了,本K对于前端虽然有了一定的认识,但对一些方面还是处于一种比较萌币的状态,就在这种萌币状态下,本K又跟着大神浩开始了后台语言-PHP语言的学习.PHP的学习对于学过其他语言的人来 ...
- Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码
Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习MapReduce时的一些 ...
- VBScript入门篇
VBScript入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.定义一个过程 定义一个过程:可以将相同的操作的代码提取出来,方便其他人来调用这段代码,可以减少你的代码的重 ...
- 【Android开发日记】之入门篇(十二)——Android组件间的数据传输
组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...
- 每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30分钟手把手教你学webpack实战 vue.js+webpack模块管理及组件开发
每天记录一点:NetCore获得配置文件 appsettings.json 用NetCore做项目如果用EF ORM在网上有很多的配置连接字符串,读取以及使用方法 由于很多朋友用的其他ORM如S ...
- Python入门篇-文件操作
Python入门篇-文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.文件IO常用操作 open:打开 read:读取 write:写入 close:关闭 readlin ...
- Membership三步曲之入门篇 - Membership基础示例
Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 - Membership基础示例 Membership三步曲之进阶篇 - 深入剖析Pro ...
随机推荐
- [Cordova 之 入门篇]
1. cordova是什么 Apache Cordova是一个开源的移动开发框架.允许你用标准的web技术-HTML5,CSS3和JavaScript做跨平台开发. 2. 为什么用cordova 基于 ...
- Python——pyqt5——各框架编程
一.日期时间(dateTimeEdit/dateEdit) setDateTime:设置日期(含时间) QDateTime.currentDateTime():当前日期(含时间) setDate:设置 ...
- IntelliJ IDEA中Mapper接口通过@Autowired注入报错的正确解决方式
转载请注明来源:四个空格 » IntelliJ IDEA中Mapper接口通过@Autowired注入报错的正确解决方式: 环境 ideaIU-2018.3.4.win: 错误提示: Could no ...
- SpringBoot配置mybatis
一直都说SpringBoot是零配置,当然,真正实现零配置是不可能的,但是在配置mybatis这里真的是太简单了,哈哈,下面我们一起看一下. 1.先导入基于SpringBoot的mybatis依赖包 ...
- SQL SERVER2000将多行查询结果拼接到一行数据及函数的创建
处理前的查询结果如上图: 通过借助SQL变量的定义 ) DECLARE @Num int SET @Scope='' ), ' ' GROUP BY ContractID 实现了一下效果: //创建拼 ...
- 使用jquery移除前面通过onclick绑定的元素的事件,然后重新绑定别的函数来执行onclick事件。
http://caibaojian.com/css3/experience/bugs.htm 使用jquery移除前面通过onclick绑定的元素的事件,然后重新绑定别的函数来执行onclick事件. ...
- VimFaultException A specified parameter was not correct configSpec.guestId
VimFaultException A specified parameter was not correct configSpec.guestId 在对接VMware的环境中创建虚拟机报错 查看错误 ...
- functools模块中partial的使用
一.简介 functools.partial(func,* args,**关键字) 返回一个新的部分对象,当被调用时,其行为类似于使用位置参数args 和关键字参数关键字调用的func.如果为调用提供 ...
- 【caffe】caffe在linux环境下的安装与编译
网上的caffe的安装教程繁杂而散乱,对初学者很不友好,尤其对该框架理解不深的童鞋.总的来说,caffe的安装不外乎几个固定的步骤,对每一步有了一定的理解,安装只是time-consuming的问题! ...
- python10--函数的来源,优点,定义,组成,使用(定义,调用)函数的分类,函数的返回值
一.函数 # *****# 函数:完成 特定 功能的代码块,作为一个整体,对其进行特定的命名,该名字就代表函数# -- 现实中:很多问题要通过一些工具进行处理 => 可以将工具提前生产出 ...