C++学习:构造函数与析构函数

news/2024/5/18 22:44:27 标签: c语言, C++, 构造函数, 析构函数

C++学习:构造函数析构函数

  1. 构造函数
  2. 析构函数

摘要:
在以前学习java的时候,都知道,java中的在定义class类的时候,都是可以定义一个构造函数,不定义的时候都是会采用默认的,构造函数是用来对类的对象进行初始化的过程.而java是吸取了C++中的优点.所以这样的一种构造函数同样也是吸取的是C++中的部分.但是在C++中却有两种初始化的过程,当然这两种是有一些区别的.在后续会讲解.构造函数是面向对象编程在初始化过程中及其重要的一部分.


友情提示
友情提示:

本文为笔记,如有写的不对的地方,欢迎指出

本文原创作者:章飞_906285288
作者的博客:http://blog.csdn.net/qq_29924041


构造函数">构造函数

在正常的情况下,我们一般在声明变量的时候都是需要去赋予初值的.
如:

 int a = 10;
 int *ptr = NULL;
 在使用内存分配函数malloc,calloc,realloc进行堆内存分配的时候,需要memset来初始化内存区域

所以在类的对象在定义的时候同样也是需要进行初始化的

1:定义:完成对象初始化的函数就是构造函数
2:类的对象的初始化是由类的成员函数类进行的
3:在建立对象的时候就直接去调用构造函数
4:类对象的定义涉及到类名和对象名
5:由于类具有唯一性,而对象具有多样性,所以使用类名来作为构造函数名字
6:默认构造函数,如果没有定义构造函数,编译器会提供默认构造函数

构造函数功能:
构造函数是负责对象的初始化工作,将数据成员初始化
创建对象的时候,其类的构造函数确保:在用户操作对象之前,系统保证初始化的进行
构造函数给对象分配空间和初始化

构造函数的语法规则:

构造函数名字与类名一样
构造函数没有返回类型
方法的实现主要是为对象来赋初值
放在外部进行定义的构造函数需要在函数名前面加”::”
构造函数是在定义对象的时候自动定义的
构造函数可以进行隐式的类型转换(ecplict禁止构造函数进行隐式转换)

注意:

如果类似 Student mStudent[5],这个定义一个Student数组,这个时候构造函数会调用5次

构造函数的初始化列表形式:

//变量定义要与初始化的顺序一致
Student::Student(int id):m_id(id),m_score(0){

};

隐式转换过程

void func(Student stu){

}
Student stu(10001);
fun(stu);
//隐式转换,通过10002来构造一个stu
fun(10002);

析构函数">析构函数

定义
1:一个类可能在构造函数里面分配资源,这些资源要在对象不复存在以前被释放掉
2: 析构函数也是一种特殊的成员,它没有返回类型,没有参数,不能随意的调用,也没有重载.只是在类对象生命期结束的时候,会由系统自动的调用
3:析构函数名,就是在构造函数前面加一个逻辑非运算符号”~”,表示”逆构造函数
4:如果类没有提供析构函数,那么编译器会为类提供一个默认的析构函数
5:析构函数不能重载,只有一个

/*
 * ===========================================================================
 *
 *       Filename:  person.h
 *    Description:  
 *        Version:  1.0
 *        Created:  2017年05月31日 22时31分28秒
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:   (), 
 *        Company:  
 *
 * ===========================================================================
 */

#ifndef __PERSON_H__
#define __PERSON_H__

#ifdef __cplusplus
extern "C"{
#endif

class Person{
  private:
    int p_high;
    int p_weight;
    int p_age;
    int p_sex;
  public:
    Person();
    //构造函数,explict主要是避免隐士转换的过程
    Person(int p_high,int p_weight,int p_age,int p_type);
    Person(int p_high,int p_weight);
    //析构函数
    ~Person();
    //声明并定义成员函数
    void setp_high(int high){
      p_high = high;
    };
    void setp_weight(int weight){
      p_weight = weight;
    };
    void setp_age(int age);
    void setp_sex(int p_sex);
    int getp_high();
    int getp_weight();
    int getp_age();
    int getp_sex();
    void print();
};

#ifdef __cplusplus
}
#endif

#endif
/*
 * ===========================================================================
 *
 *       Filename:  person.cpp
 *    Description:  
 *        Version:  1.0
 *        Created:  2017年05月31日 22时43分45秒
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:   (), 
 *        Company:  
 *
 * ===========================================================================
 */

#include<iostream>
using namespace::std;

#include <person.h>

Person::Person(){
  cout<<"person constructor one"<<endl;
}

Person::Person(int p_high,int p_weight,int p_age,int p_type){
  cout<<"person constructor three"<<endl;
  p_high = p_high;
  p_weight = p_weight;
  p_age = p_age;
  p_sex = p_type;
}
/* *
 *初始化参数列表
 *
 * */
Person::Person(int p_high,int p_weight):p_high(15),p_weight(100)
{
  cout<<"person constructor three";
}

/* *
 *析构函数
 * */
Person::~Person(){
  cout<<"Person Destructor"<<endl;
}

/* *
 *成员函数的定义
 *
 * */

void Person::setp_age(int age){
  p_age = age;
}

void Person::setp_sex(int p_sex){
  p_sex = p_sex;
}

int Person::getp_high(){
  return p_high;
}

int Person::getp_weight(){
  return p_weight;
}


int Person::getp_age(){
  return p_age;
}

int Person::getp_sex(){
  return p_sex;
}

void Person::print(){
  cout<<"p_high:"<<p_high<<endl;
  cout<<"p_weight:"<<p_weight<<endl;
  cout<<"p_age:"<<p_age<<endl;
  cout<<"p_type:"<<p_sex<<endl;
}
/*
 * ===========================================================================
 *
 *       Filename:  PersonTest.cpp
 *    Description:  
 *        Version:  1.0
 *        Created:  2017年05月31日 22时53分03秒
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:   (), 
 *        Company:  
 *
 * ===========================================================================
 */

#include<iostream>
using namespace::std;

#include <person.h>


int main(int agrc ,char *argv[]){

  Person p_zhangsan(178,105);
  p_zhangsan.setp_high(178);
  p_zhangsan.setp_weight(140);
  p_zhangsan.setp_age(25);
  p_zhangsan.setp_sex(0);

  p_zhangsan.print();
  cout<<"----------"<<endl;

  Person p_lisi(170,150,20,0);
  p_lisi.print();
  cout<<"------------------"<<endl;

  {
    Person p_xiaohua(160,110);
    p_xiaohua.setp_sex(1);
    p_xiaohua.setp_age(18);
    p_xiaohua.print();
  }



  return 0;
}

以上的代码都是可以直接进行run的,下面是输出的结果

这里写图片描述

总结:
构造函数析构函数是控制了一个类的定义和结束的过程
构造函数是控制了类的对象的初始化,资源申请的过程
析构函数是控制了类对象的结束过程,资源释放的过程


http://www.niftyadmin.cn/n/783676.html

相关文章

Convolutional Neural Network Architectures for Matching Natural Language Sentences

interaction n. 互动;一起活动;合作;互相影响 capture vt.俘获;夺取;夺得;引起&#xff08;注意、想像、兴趣&#xff09;n.捕获;占领;捕获物;[计算机]捕捉 hence adv. 从此;因此&#xff0c;所以;从此处 empirical adj. 经验主义的;凭经验的;以观察或实验为依据的 variety …

C++学习:最全标准库类型string的使用

C学习:标准库类型string 摘要 string标准库是C提供的抽象数据类型,也是一种非常重要的数据结构.主要用于字符串之间的操作 中文的字符编码标准是GB18030,一般的汉字占用的内存为两个字节 并且string类型是支持可变长度的字符串 版权说明 本文作者:章飞_906285288 作者博客:…

类和对象之动手动脑

1.请输入并运行以下代码&#xff0c;得到什么结果&#xff1f; 以上代码运行结果是False,说明建立的两个对象的存储地址不一样。 2.以下代码为何无法通过编译&#xff1f;哪儿出错了&#xff1f; 之所以出错&#xff0c;是因为Foo类本身有自定义的构造函数。 3.静态初始化块的执…

C++学习:static静态成员即static成员函数

摘要: 在学习java的时候,有一个非常重要的关键字static,静态的意思.在java中使用static修饰的变量或者函数,表示此变量是属于类的而不是属于对象的,在程序加载的时候就会初始化. 在C语言中使用static修饰的变量其声明周期被放大到了整个程序,使用static修饰的函数,表示其是内…

easyui window窗口 随body的滚动条 滚动

问题描述&#xff1a; 当easyui window窗口弹出的时候&#xff0c;依然可以滚动body 的滚动条&#xff0c;而且window窗口也会随它一起滚动 思路&#xff1a;bootstrap 模态框弹出的时候&#xff0c;给body 添加了 .modal-open .modal-open {overflow: hidden;}当模态框关闭的…

warning: implicit declaration of function ‘topo_analysis‘ [-Wimplicit-function-declaration]

1&#xff1a;警告信息 warning: implicit declaration of function ‘topo_analysis’ [-Wimplicit-function-declaration] 含义topo_analysis是函数是隐式声明 2&#xff1a;现象 当一个c文件中需要调用另一个c文件的函数是&#xff0c;会发生这种警告信息 例如&#xff…

C++学习:动态内存分配对象的new/delete运算符与函数malloc/free

C学习:对象的new/delete运算符与函数malloc/free 摘要: 在学习java的时候,都是使用new来创建新的对象的,对象的存放在堆里的.而回收是由java虚拟机garbage collectiong也就是GC来自动回收的 在学习C语言的时候,我们知道有malloc/calloc以及realloc来进行内存分配,使用free函…

Linux中的list使用

目录1&#xff1a;使用说明2&#xff1a;常用函数2.1 list_head2.2&#xff1a;LIST_HEAD_INIT2.3&#xff1a;list_add2.4 list_del2.4&#xff1a;list_for_each2.5 list_entry3&#xff1a;示例1&#xff1a;使用说明 在linux下有一种常用的链表结构。当你需要很多相同结构…