析构函数

构造函数、析构函数

Deadly 提交于 2020-01-16 08:02:43
构造函数主要用于创建对象并将对象的数据初始化。 析构函数是对象即将被销毁的时候做一些清理工作。 class A ( ) : #构造函数 def __init__ ( self , age , name ) : self . age = age self . name = name #析构函数 def __del__ ( self ) : pass 构造函数的特点:第一个参数是 self ,特殊函数__init__ 析构函数:特殊函数__del__ 构造函数和普通成员函数之间的区别和联系: 区别: 构造函数的函数名是固定的,是__init__,普通成员函数的名可以自定义 构造函数是在创建对象的时候,但是,普通成员函数必须手动调用 对于同一个对象而言,构造函数只被调用一次,但是,普通的成员函数可以被无限次调用。 联系: 遵循函数的基本用法,默认参数,关键字参数和不定长参数同样都适用 构造函数也是一个成员函数,形参列表的第一个参数都是self,代表的是当前对象 来源: CSDN 作者: 呆呆文 链接: https://blog.csdn.net/weixin_45527702/article/details/103995950

构造函数、析构函数抛出异常的问题

自古美人都是妖i 提交于 2020-01-14 07:39:24
1. 抛出异常 1.1 抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。 该语句的格式为: throw 表达式; 如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。由于C++使用数据类型来区分不同的异常,因此在判断异常时,throw语句中的表达式的值就没有实际意义,而表达式的类型就特别重要。 1.2 抛出异常实际是作为另一种返回值来使用的。 抛出异常的好处一是可 以不干扰正常的返回值 ,另一个是 调用者必须处理异常 ,而不像以前c语言返回一个整数型的错误码,调用者往往将它忽略了。 1.3 举例说明 假如说A方法掉调用-->B方法调用-->C方法。 然后在B和C方法里定义了throws Exception。A方法里定义了Try Catch。 那么调用A方法时,在执行到C方法里出现了异常,那么这个异常就会从C抛到B,再从B抛到A。在A里的try catch就会捕获这个异常,然后你就可以在catch写自己的处理代码。 那么为什么当时出现了异常不去处理呢? 因为你业务逻辑调用的是A方法,你执行了A方法,当然要在A里得到异常,然后来处理。如果在C里面就处理异常

malloc、free、new、operator new、placement new、delete([ ])动态内存管理

非 Y 不嫁゛ 提交于 2020-01-13 02:21:17
一、malloc与free 堆的特征:执行的速度相对较慢;空间较大;生存期由“自己”决定,malloc申请,free释放;作用域很大(整个程序都可以访问);无名空间,只能通过指针使用; 申请堆空间:void *malloc(size_t size); 功能:在堆中申请空间 size:要申请的空间的大小(字节数)       返回值类型:void * 该类c返回型表明mallo的地址空间中的数据类型是不确定,必须经过强制类型转换才可以使用。 返回值:成功时,返回malloc申请的空间的起始地址,失败时,返回NULL。 特点:①malloc申请的空间为连续空间;②malloc申请的是没有初始化的空间; 释放空间:void free(void *ptr); 参数ptr:①不能传NULL; ②不能给ptr传申请的空间的一部分,例如:③不能释放已经被释放的空间;④不能使用已经被释放的空间; 二、new、operator new、placement new、delete([ ]) 1.new与delete A* p = new A(); 在这个代码中,这里的new实际上是执行如下3个过程: (1)调用operator new分配内存,大小为A对象所占用内存大小; (2)调用构造函数生成类对象; (3)返回相应指针。 注:在C++中使用new关键字相当于先申请内存后执行构造函数

C语言到C++入门

久未见 提交于 2020-01-12 21:58:49
C语言到C++入门 前言 很早以前就学了c语言,后来也学习了Java语言,突然想看看c++语言。也没想学的多深,毕竟C++是公认的难、不过我想有其他语言基础,学习一下基本语法应该相对简单的。 环境 g++ c++17 1、准备 C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。 经常看到的一句话是 c++就是 c with class c++的文件扩展名是cpp. 2、结构 一个c++的语言结构如下: 头文件, 中含有c++的标准输入输出流 命名空间、用于管理模块,一个文件中可以有多个命名空间 #include <iostream>//头文件 using namespace std;//命名空间 void add(int *x,int y);//函数声明 int main() { int x=0; add(&x,10); cout<<x<<" end"<<endl;//标准输出流 string s;//字符串 cout<<"input string"<<endl; cin>>s;//标准输入 cout<<"out "<<s;//换行 } void add(int *x,int y){//函数 *x=*x+y; } 这个文件使用了 iostream文件下的std命名空间。cout\cin都是此文件std下的功能。>>箭头是流操作符。 3、命名空间

【C++】寒假学习-类和对象

回眸只為那壹抹淺笑 提交于 2020-01-11 08:54:50
1. C++内存布局分为几个区域,各自具备什么特点? 在C++中,程序在内存中的存储被分为五个区: 1)、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2)、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3)、全局/静态区(static):全局变量和静态变量的存储是 放在一块的,在程序编译时分配 4)、文字常量区:存放常量字符串 5)、程序代码区:存放函数体(类的成员函数、全局函数) 的二进制代码 2. 当定义类时,编译器会为类自动生成哪些函数?这些函数各自都有什么特点? 对于一个空类,C++编译器默认生成四个成员函数:默认构造函数、析构函数、拷贝(复制)构造函数、赋值函数。 1)、默认构造函数(default constructor): 在没有显式提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。如果定义某个类的变量时没有提供初始化式就会使用默认构造函数。如果用户定义的类中没有显式的定义任何构造函数,编译器就会自动为该类型生成默认构造函数,称为合成的构造函数(synthesized default constructor)。C+

php面向对象基础 析构函数 对象传值

余生颓废 提交于 2020-01-07 13:37:26
析构方法(了解)   定义:析构__destruct(),也是一种类结构中特殊的方法,与构造方法一样,也是系统规定好的,只需要开发人员抄写一遍即可。对象被销毁时会自动调用  1.析构方法实现:类中增加一个destruct()方法 <?php class studentaa{ public function __destruct() { echo __FUNCTION__; } } $obj=new studentaa(); //注销对象的时候会返回析构函数的方法名称 unset($obj); ?> 析构方法调用:析构方法是在对象被销毁时自动调用,对象的垂死挣扎; 析构方法是对象用来调用释放对象中的资源,不是用来删除对象的, 析构函数也是普通方法,可以有对象直接调用(没有意义)。   对象销毁情形     保存对象的变量被用来保存其他数据,导致对象内存没有任何变量引用     删除对象变量     脚本执行结束:释放所有变量 总结:析构方法是一种对象销毁时自动调用的方法     析构方法是用来对象销毁自身所占用的资源。 对象传值   定义:对象传值,其实就是将保存对象的变量赋值给另外一个变量,在php中,对象的传值是引用传递的,即一个对象变量赋值给另外一个变量,两个变量指向同一个对象内存地址,即只有一个对象。 对象传值就是保存对象的变量赋值给另外一个变量    <?php class

《Effective Mocern C++》item 22: Pimpl Idiom

此生再无相见时 提交于 2020-01-06 19:43:40
PIMPL(Private Implementation 或 Pointer to Implementation)是通过一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏。 PIMPL基于这样一个事实:在C++类中,允许定义一个成员指针,指向一个已声明过的类型。在头文件中只是存放该类型的声明,而具体的定义是存放在CPP文件中,这样就可以隐藏类型的具体实现。 该chapter与讲解unique_ptr的chapter息息相关: https://blog.csdn.net/qq_35865125/article/details/103752348 ---------------comment: 对于incomplete type,可以用来声明指针或者引用,不能使用其进行实例化。 ---用std::unique_ptr来代替裸指针: --上面这样使用std::unique_ptr可能会出现的编译错误: 上面的代码没有为Widget类实现析构函数,因此编译器会自动 生成一个默认的析构函数,析构函数会调用widget类的各个成员变量的析构函数,当调用成员std::unique_ptr<Impl>的 析构函数时报错了,该成员的析构函数就是unique_ptr类的析构函数,其会对其包裹的指针进行delete, 下文中提到,在delete 之前c++会对将要被delete的指针进行检查

c++复习笔记(3)

前提是你 提交于 2020-01-05 04:23:35
这篇是各种琐碎的东西。 类的函数如果在类内部直接实现,则成为内联函数候选。类外部实现的方法,可以用inline声明,使其称为内联函数候选。但是函数是否可以成为内联函数,需要看编译器的行为。、 构造函数可以使用初始列: functionName (varList) : var1(value1), var2(value2) {} 构造函数可以放在private区(单例)。 类的成员函数可以分为改变类的值的和不改变类的值的。不改变类的值的函数可以加const: returnType functionName (varList) const {} 这里注意,这么写的原因,有一个是:当我们声明了一个const的实例,然后调用不是const的方法就会出错。所以对不改变值的函数,加上const,就可以被const实例正常调用。 函数的参数传递和返回值,首先考虑引用。若参数不需要变化时,要传const引用。 标记friend的方法可以访问class的private部分,注意友元函数并不是类的一部分,仅仅是需要在类中进行声明。相同class的objects互为friends。 对于返回值,如果返回的是传入的指针或引用,则可以返回引用。如果返回的是函数内新建的变量,就不能返回引用(因为函数结束之后,新建的变量的生命周期就结束了,此时返回引用就会发生错误)。 所有的成员函数都默认有一个参数this

C/C++ 复习

末鹿安然 提交于 2020-01-05 04:23:10
本文总结一下C++面试时常遇到的问题。C++面试中,主要涉及的考点有 关键字极其用法,常考的关键字有const, sizeof, typedef, inline, static, extern, new, delete等等 语法问题 类型转换 指针以及指针和引用的区别 面向对象的相关问题,如虚函数机制等 泛型编程的相关问题,如模板和函数的区别等 内存管理,如字节对齐(内存对齐)、动态内存管理、内存泄漏等 编译和链接 实现函数和类 本文不涉及STL的内容,有关STL的内容,会另有一篇文章专门总结。 零、序章 0.1 C++与C的对比 C++有三种编程方式:过程性,面向对象,泛型编程。 C++函数符号由 函数名+参数类型 组成,C只有函数名。所以,C没有函数重载的概念。 C++ 在 C的基础上增加了封装、继承、多态的概念 C++增加了泛型编程 C++增加了异常处理,C没有异常处理 C++增加了bool型 C++允许无名的函数形参(如果这个形参没有被用到的话) C允许main函数调用自己 C++支持默认参数,C不支持 C语言中,局部变量必须在函数开头定义,不允许类似for(int a = 0; ;;)这种定义方法。 C++增加了引用 C允许变长数组,C++不允许 C中函数原型可选,C++中在调用之前必须声明函数原型 C++增加了STL标准模板库来支持数据结构和算法 一

实验三 类与对象

时光总嘲笑我的痴心妄想 提交于 2020-01-02 00:32:16
四、实验结论 验证性实验部分 总结你对类、对象、构造函数、复制构造函数、析构函数的认识、理解和思考。 类与对象: 对象是对客观事物的抽象,类是对对象的抽象。 (1)类类型的声明: class 类名 { public: 公用的数据和成员函数 protected: 保护的数据和成员函数 private: 私有的数据和成员函数 } (2)什么是构造函数? 通俗的讲,在类中,函数名和类名相同的函数称为构造函数。它的作用是在建立一个对象时,作某些初始化的工作(例如对数据赋予初值)。C++允许同名函数,也就允许在一个类中有多个构造函数。如果一个都没有,编译器将为该类产生一个默认的构造函数。此默认构造函数的功能是为对象分配内存,但无法为成员数据赋初值。 构造函数上惟一的语法限制是它不能指定返回类型,甚至void 也不行。 用于在创建对象时为对象分配内存 ,并可以将其初始化到特定的状态。 1,不带参数的构造函数:一般形式为: 类名 对象名(){函数体} 2,带参数的构造函数:不带参数的构造函数,只能以固定不变的值初始化对象。带参数构造函数的初始化要灵活的多,通过传递给构造函数的参数,可以赋予对象不同的初始值。 一般形式为:构造函数名(形参表); 创建对象使用时:类名 对象名(实参表); 如果类中没有写构造函数,编译器会自动生成一个隐含的默认构造函数,该函数是个空值。 小结: 构造函数的重载