C++分析类的对象作类成员调用构造与析构函数及静态成员

目录
  • 类对象作为成员
  • 静态成员
    • 定义和分类
    • 静态成员变量
    • 静态成员函数
  • 总结

类对象作为成员

C++类中的成员可以是另一个类的对象,我们称该成员为 对象成员

例如:

class Phone {}
class Person
{
    Phone p;
}

tips:当类中成员是其他类对象时,我们称该成员为 对象成员

Person类中有对象p作为成员,Phone为对象成员,那么当创建Person对象时,Phone与Person的构造和析构的顺序是谁先谁后?

那让我们在两个类中加上一些输出语句做提示就好了,可以清晰的看到构造和析构的顺序。

示例:

#include<iostream>
using namespace std;
//类对象作为类成员
class Phone
{
public:
	Phone(string P_name)
	{
		p_name = P_name;
        cout<<"Phone类有参构造"<<endl;
	}
    ~Phone()
	{
		cout << "Phone析构" << endl;
	}
	string p_name;
};
class Person
{
public:
	Person(string m_Name,string p_Name):m_name(m_Name),m_PName(p_Name) {
        cout << "Person构造" << endl;}//初始化列表
    ~Person()
	{
		cout << "Person析构" << endl;
	}
	string m_name;
	Phone m_PName;
};
void test01()
{
	Person p1("张三", "华为nova7");
	Person p3(p1);//调用默认拷贝构造函数
	p3.m_name = "李白"; p3.m_PName.p_name = "iphone MAX";
	cout << p1.m_name << "拿着" << p1.m_PName.p_name << endl;
	cout << p3.m_name << "拿着" << p3.m_PName.p_name << endl;
}
int main()
{
	test01();
}

从结果图中看出同时调用有参构造的时候,先调用对象成员的构造,再调用本类构造

析构的顺序相反

静态成员

定义和分类

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员

静态成员分为:

静态成员变量

  • 所有对象共享同一份数据
  • 在编译阶段分配内存
  • 类内声明,类外初始化

静态成员函数

  • 所有对象共享同一个函数
  • 静态成员函数只能访问静态成员变量

静态成员变量

class Person
{
public:
	static int m_A;
private:
	static int m_B;
};
int Person::m_A = 10;
int Person::m_B = 10;
void test01()
{
	//静态成员变量两种访问方式
	//1、通过对象
	Person p1;
	p1.m_A = 100;
	cout << "p1.m_A = " << p1.m_A << endl;
	Person p2;
	p2.m_A = 200;
	cout << "p1.m_A = " << p1.m_A << endl; //共享同一份数据
	cout << "p2.m_A = " << p2.m_A << endl;
	//2、通过类名
	cout << "m_A = " << Person::m_A << endl;
	//cout << "m_B = " << Person::m_B << endl; //私有权限访问不到
}
int main() {
	test01();
	system("pause");
	return 0;
}

静态成员变量也是有访问权限的,无论是public或者是private在类内都可以被访问,m_A和m_B在类内定义在类外初始化,还记得类外初始化吗,就是变量类型加类名加::变量名=值;同时可以通过对象和类名两种方式访问静态成员变量。

静态成员函数

class Person
{
public:
	int getB()
	{
		return m_B;
	}
	static int m_A;
	int m_C;//非静态成员变量
	//静态成员函数
	static void func()
	{
		m_A = 100;
		//m_C = 20;
		cout << "static void func 的调用" << endl;
	}
private:
	static int m_B;
	static void func2()
	{
		cout << "static void func 的调用" << endl;
	}
};
int Person::m_A = 100;//类外外面初始化
int Person::m_B = 200;
void test03()
{
	//调用方式有两种
	//1、通过对象调用
	Person p;
	p.func();
	//通过类名调用
	Person::func();
	//类外访问不到静态成员函数,静态成员函数也有访问权限
}

静态成员函数也有权限的控制,代码里写了func是公共权限,func2是私有权限;静态成员函数也有对象调用和类名调用两种方式,但是都无法调用私有权限的静态成员函数。

注意事项:静态成员函数不可以访问非静态成员变量,无法区分到底是哪个对象的属性,只有公用的静态成员变量才可以被访问。

总结

热烈庆祝对象的初始化和清理完工,作为C++核心编程比较重要的一部分,我也是认真的总结了一遍,感觉很充实,下篇博客直指this指针和成员变量以及成员函数的存储问题,期待你的鼓励,下篇再见!

到此这篇关于C++分析类的对象作类成员调用构造与析构函数及静态成员的文章就介绍到这了,更多相关C++类的对象内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 正确理解C++的构造函数和析构函数

    目录 一.构造函数 二.C++类的内存模型 2.1.只定义成员函数 2.2.往空类中添加静态成员变量 2.3.再加入非静态成员变量 三.this指针 四.析构函数 一.构造函数 首先,由于类只是一个模板,因此我们在定义类时无法对成员变量初始化,比如下面代码就是错误的: class circle{ public: int m_L = 20; // Error:不允许使用数据成员初始值设定项 }; 因此,初始化只能发生在类创建对象的过程中,但是由于访问权限的原因,无法在类外访问某些成员变量,因此下面

  • 详解c++ 静态成员变量

    类定义时的静态成员只是声明,静态成员的定义和初始化要在类之外完成 C++的static关键字可修饰类成员变量/方法,表示变量/方法不从属于特定对象,而是属于类的.仔细琢磨静态成员变量,会发现其与C++的方式既相容也矛盾,具有特殊性. 先说相容的一面.·C/C++·有声明和定义的说法:声明给出签名,定义给出具体实现.对类型而言,声明不一定能知道其对象占用空间大小,但根据定义肯定能确定内存占用.说静态成员与C++方式是相容的,因为其初始化方式与方法的定义一致.下面是一个例子: // Foo.hpp

  • C++中构造函数详解

    构造函数按参数为为:有参构造函数和无参构造函数 按类型分为:普通构造函数和拷贝构造函数 构造函数的三种调用方法:括号法,显示法,隐式转换法: //括号法 Person p1; //默认构造 无参构造 Person p2(13); //有参构造 Person p3(p2); //拷贝构造 //注意:使用无参构造时不要写括号.不然系统会认为该语句是函数声明. 例:Person p1(); //显示法 Person p1; Person p2 = Person(13);//有参构造 Person p3

  • C++构造函数的类型,浅拷贝与深拷贝详解

    目录 一.无参构造函数 二.含参构造函数 三.拷贝构造函数 四.深拷贝和浅拷贝 总结 一.无参构造函数 1.如果没有定义构造函数,则系统自动调用此默认构造函数,且什么都不做. 2.如果用户自定义了带参数的构造函数,若还想调用无参的构造函数,必须显示定义 person() { cout << "this object is being created." << endl; } 二.含参构造函数 一般构造函数可以有各种参数形式,一个类可以有多个一般构造函数,前提是参

  • C++分析构造函数与析造函数的特点梳理

    目录 构造函数的调用 构造函数的分类及调用 拷贝构造的调用时机 深拷贝与浅拷贝 构造函数的调用 默认情况下编译器至少给一个类添加3个函数 1.默认构造函数(无参,函数体实现)--完成对象的初始化 2.默认析构函数(无参,函数体为空)--完成对象的清理 3.默认拷贝构造函数,属性进行值拷贝 规则: 如果用户定义了有参构造,c++不会提供无参构造,但是提供默认拷贝构造 如果用户定义了拷贝构造函数,c++不会在提供其他函数 类名(){} 构造函数的语法 1,没有返回值,也不写void: 2,函数名称与

  • c++详细讲解构造函数的拷贝流程

    #include <iostream> #include <string> using namespace std; void func(string str){ cout<<str<<endl; } int main(){ string s1 = "http:www.biancheng.net"; string s2(s1); string s3 = s1; string s4 = s1 + " " + s2; fu

  • C++中静态成员函数与静态成员变量(static )

    C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用.如果有一些C++知识记不清楚了,它可以帮你很快回忆起来. 复习C语言的static关键字 (1)加在局部变量的前面使之成为静态局部变量,作用域还是在函数内部,可是生存周期延长了. (2)加在全局变量的前面限定该变量作用域为文件作用域,就是说即使其他文件使用了extern扩展作用域也不行.这在C语言的多人项目中非常有用,避免了变量的重名.然而在C+

  • C++踩坑实战之构造和析构函数

    目录 前言 构造函数 通过构造函数实现的类型转换 派生类的构造函数 析构函数 继承中的析构函数 应用 总结 前言 我是练习时长一年的 C++ 个人练习生,喜欢野指针.模板报错和未定义行为(undefined behavior).之前在写设计模式的『工厂模式』时,一脚踩到了构造.继承和 new 组合起来的坑,现在也有时间来整理一下了. 构造函数 众所周知:在创建对象时,防止有些成员没有被初始化导致不必要的错误,在创建对象的时候自动调用构造函数(无声明类型),完成成员的初始化.即: Class c

  • C++:构造函数,析构函数详解

    目录 前言 一.面向对象 二.构造函数 1.基本概念 2.构造函数重载 1.构造函数分类 2.有参构造函数: 3.有参构造函数3个调用规则: 4.拷贝构造函数 5.析构函数 总结 前言 上期了解C++类中有public.protected.private三种访问权限. 肯定会有人疑惑,C++为什么要设置这三个权限呢 本期内容就是围绕上面的问题展开说明 一.面向对象 开始的文章就提到过,类是(OOP)面向对象编程的基础 那么面向对象编程究竟是个什么东东呢 百度百科是这样解释的 通俗的来说就是利用代

  • C++分析类的对象作类成员调用构造与析构函数及静态成员

    目录 类对象作为成员 静态成员 定义和分类 静态成员变量 静态成员函数 总结 类对象作为成员 C++类中的成员可以是另一个类的对象,我们称该成员为 对象成员 例如: class Phone {} class Person { Phone p: } tips:当类中成员是其他类对象时,我们称该成员为 对象成员 Person类中有对象p作为成员,Phone为对象成员,那么当创建Person对象时,Phone与Person的构造和析构的顺序是谁先谁后? 那让我们在两个类中加上一些输出语句做提示就好了,

  • C++类和对象实例解析(二)

    C++既是面向对象也是面向过程的语言,在这里就有一个重要的概念--类.         何谓类?类是对对象的一种抽象,举例来讲:每一个实实在在存在的人就是一个对象,人有很多共同的特征(一个头,两条腿,能走,能跑),这具有共同特征的人就成为一个类.类是一个抽象的名词,每一个人(即对象)是这个类的实例.         对象间具有的共同特征是对象的属性和行为.录像机是一个对象,它的属性是生产厂家.牌子.重量.颜色等等,它的行为就是它的功能,如录像.放像.快进.倒退等操作. C++程序中,需要先定义一

  • JavaScript中的类数组对象介绍

    JavaScript中,数组是一个特殊的对象,其property名为正整数,且其length属性会随着数组成员的增减而发生变化,同时又从Array构造函数中继承了一些用于进行数组操作的方法.而对于一个普通的对象来说,如果它的所有property名均为正整数,同时也有相应的length属性,那么虽然该对象并不是由Array构造函数所创建的,它依然呈现出数组的行为,在这种情况下,这些对象被称为"类数组对象".以下是一个简单的类数组对象: 复制代码 代码如下: var o = {0:42,

  • C++OOP对象和类的详细讲解

    目录 C++OOP对象和类 1.预备知识 2.抽象和类 2.1 数据抽象 2.2 类 2.3 接口 3.C++中的类和对象 3.1 C++类的定义 3.2 C++对象的定义 3.3 C++访问数据成员 3.4 C++类成员函数 总结 C++OOP对象和类 本文将从入门的角度介绍C++OOP中的类和对象,事实上C++的类和对象远远不止本文所介绍的内容. 不过如果你感兴趣,我会把其他的内容逐一通过文章的形式介绍给你. 1.预备知识 面向对象编程(OOP)是一种特殊的.设计程序的概念性方法,C++通过

  • C++类和对象基础详解

    目录 一.类和对象的基本概念 结构化程序设计 面向对象的程序设计 使用类的成员变量和成员函数 二.类和对象基础 类成员的可访问范围 构造函数(constructor) 基本概念 拷贝(复制)构造函数 类型转换构造函数 析构函数(destructors) 总结 一.类和对象的基本概念 结构化程序设计 C语言使用结构化程序设计: 程序 = 数据结构 + 算法 程序由全局变量以及众多相互调用的函数组成 .算法以函数的形式实现,用于对数据结构进行操作. 结构化程序设计的不足 1.结构化程序设计中,函数和

  • C++ 再识类和对象

    目录 类的6个默认成员函数 构造函数 1.概念 2.特性 隐式构造函数 无参和全缺省的函数均为默认构造函数 成员变量的命名风格 补充 析构函数 1.概念 2.特性 c++编译器在对象生命周期结束时自动调用析构函数 拷贝构造函数 1.概念 2.特性 若未显式定义,系统会生成默认的拷贝构造函数 浅拷贝的注意事项 总结 类的6个默认成员函数 一个类中如果什么成员都没有,那么这个类称为空类.空类中是什么都没有吗?其实不然,任何一个类,再我们不写的情况下,都会自动生成下面6个默认成员函数: 本篇文章将对这

  • Java 类与对象重难点详解

    目录 什么是类.对象? 类和类的实例化 字段的初始化 类当中实现方法 static 静态关键字 封装 private 实现封装 setter 和 getter 方法 构造方法 this 关键字 匿名对象 什么是类.对象? 因为计算机并不能像我们人这样去理解世界上的东西,所以为了更好的编辑,就抽象出了类和对象.类就是把功能放在一起,然后由一个人去调用这个功能,然后再编辑对应的功能.调用者就是对象的实现者 类和类的实例化 类是一类对象的统称,对象就是这一类具体化的实例 创建类的关键字:class 举

  • C++类和对象之封装详解

    目录 封装的意义以及示例 访问权限 公共权限 public 保护权限 protected 私有权限 private struct 和 class的区别 成员属性私有化 案例1:设计立方体类 案例2:点和圆的关系 总结 封装的意义以及示例 封装是C++面向对象三大特征之一 封装的意义: 将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限控制 语法:class 类名{  访问权限 : 属性  /  行为 }: 类的对象的公共数据成员可以使用直接成员访问运算符 . 来访问. 示例1: 设计

  • JavaSE的类和对象你真的了解吗

    目录 1.基本概念 1.1面向对象 1.2类和对象 2.类的定义及使用 2.1定义 2.2类的实例化 3.this引用 3.1访问成员变量 3.2访问成员方法 3.3this引用的特性 4.构造方法 4.1构造方法的特点 4.2this在构造方法中使用 总结 1.基本概念 首先我们需要弄清楚几个概念:面向对象是什么.类是什么.对象又是什么?还是逐个来说 1.1面向对象 我们常说Java是面向对象的语言,C语言是面向过程的语言,那面向对象是什么,它和面向过程的区别在哪? 面向对象是解决问题的一种思

  • C++类与对象深入之构造函数与析构函数详解

    目录 对象的初始化和清理 一:构造函数 1.1:构造函数的特性 1.2:构造函数的分类 二:析构函数 2.1:概念 2.2:特性 三:拷贝构造函数 3.1:概念 3.2:特性 3.3:拷贝构造函数调用时机 3.4:构造函数调用规则 对象的初始化和清理 生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全.C++中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置. 一:构造函数 对象的初始化和清理也是两个非常重要的安全问题,一个

随机推荐