c++面向对象程序设计教程——类(一)

简介: c++面向对象程序设计教程——类(一)

this指针


同一类的各个对象创建后,都在类中产生自己成员的副本。而为了节省存储空间,每个类的成员函数只有一个副本,成员函数由各个对象调用。

那么对象在副本中如何与成员函数建立关系?c++为成员函数提供了一个称为this的指针,当创建一个对象的时候,this会自动初始化指向该对象,当某一个对象调用一个成员函数的时候,this指针将作为一个变量传递给该函数。所以,不同的对象调用一个成员函数的时候,编译器会根据this指针来确定应该引用哪一个对象的数据成员。

下面用代码来初步认识一下this指针:


#include<iostream>
using namespace std;
class Point
{
public:
  Point(int =0,int =0);
  void displayxy();
private:
  int X, Y;
};
Point::Point(int x,int y)//双参构造函数;
{
  X = x;
  Y = y;
}
void Point::displayxy()
{
  cout << X << endl;
  //cout<<this->X<<endl;
  cout << Y << endl;
  //cout<<this->Y<<endl;
}
//在这里我们可以看到,this指针是一种隐函数对象指针,它指向的是该函数的数据成员;
int main(void)
{
  Point obj1(10, 20), obj2(8, 9), * p;
  p = &obj1;//p指向对象obj1;
  p->displayxy();
  p = &obj2;//p指向对象obj2;
  p->displayxy();
}


通过上述代码,我们可以发现,this指针并不会被表示出来,也就说明它是一个隐含对象指针。

那么this指针有哪些属性喃?


this指针的属性


this是一个局部量,局部于某个对象 this是一个常量,它不能作为赋值,递增,递减等运算的目标对象

只有非静态类成员函数才拥有this指针并通过该指针来处理对象 实际中,通常不去显示使用thi是指针引用数据成员和成员函数


子对象和堆对象


1.子对象的声明*

一个对象作为另一个类的成员时,该对象称为该类的子对象。子对象实际上也是某个类的成员。

*


700c4360530169647c3e6c3def7654d8_221539d9b9b64cdd864867490e0fe9a6.png


//c++面向对象——类
#include<bits/stdc++.h>
using namespace std;
class MyClass
{
public:
  MyClass(int =0,int =0);//无参构造函数;
  ~MyClass();//析构函数;
  void destroyxy();
private:
  int X, Y;
};
//构造函数;
MyClass::MyClass(int x,int y)
{
  X = x;
  Y = y;
  cout << "Destroy is called!" << endl;
}
//构造析构函数;
MyClass::~MyClass()
{
  cout << "Destroy is called!!!" << endl;
}
void MyClass::destroyxy()
{
  cout << "Destroy is called!";
  cout << setw(4) << "(" << this->X << "," << this->Y << ")" << endl;
}
class Whole 
{
public:
  Whole(int);
  Whole(int, int);
  ~Whole();
private:
  MyClass p1, p2;//子对象;
};
Whole::Whole(int x)
{
  cout << "Construct of Whole" << endl;
  cout << x << endl;
}
Whole::Whole(int x, int y) :p1(x), p2(y)
{
  cout << "Construct is called" << endl;
}
Whole::~Whole()
{
  cout << "end of this" << endl;
}
int main(void)
{
  Whole whole(3, 4);
  Whole w(3);
}



通过上面的代码我们可以很明确的看出有一行代码的格式:Whole::Whole(int x, int y) :p1(x), p2(y)

那么这行代码又代表什么意思喃?


2.子对象的初始化


为初始化子对象,X的构造函数要调用这些对象成员所在类的构造函数,于是X类的构造函数中就应该包含数据成员初始化列表,用来给于对象进行初始化;

<类>::<类>(<参数>):<成员1>(参数),<成员2>(参数)~~

{


~~

}

注意:冒号后由逗号隔开的想组成数据成员初始化列表,成员初始化列表是由一个或者多个项组成,多个选项之间由逗号隔开。可以是对子对象进行初始化,也可以是对该类中其他的数据成员初始化。对子对象的构造函数的调用函数的舒徐取决于这些子对象在类中的说明顺序,与数据成员初始化列表顺序无关。


堆对象


堆对象是指在程序运行时根据需要随时可以被创建和删除的对象,在虚拟的程序空间中存在一些空闲存储单元,这些存储单元组成我们所谓的堆。

c++程序的内存格局通常分为4个区:


e960e6741552bb66d85530bb463eb457_8e26362995614f9ba4f5e8e2b6c35337.png


创建和删除堆对象可以用如下两个运算符,new,delete;

l下面我们用一段代码来认识这两种运算符的用法;


#include<iostream>
using namespace std;
class Heapclass
{
public:
  Heapclass();//构造函数;
  ~Heapclass();//析构函数;
private:
  int i;
};
Heapclass::Heapclass()
{
  cout << "Default Constructor is called." << endl;
}
Heapclass::~Heapclass()
{
  cout << "Destructor is called" << endl;
}
int main(void)
{
  Heapclass* ptr;
  ptr = new Heapclass[2];//申请动态空间表明有两个元素,每个元素都是该类的对象;
  if (ptr)
  {
  cout << "Out of Memory!" << endl;
  }
  cout << "Exit main" << endl;
  delete[]ptr;
  return 0;
}


af486d08e2e89074a8860a53b1ac2b3e_0222142275e443e2ba7f580ff6c62d83.png


通过程序运行结果我们可以发现,最后释放对象的时候,调用了两次析构函数,创造对象的时候,一共调用了2次构造函数,所以,通过这里,我们也不难发现构造函数和析构函数的用途;

相关文章
|
28天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
50 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
103 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
88 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
106 4
|
2月前
|
算法 数据挖掘 Shell
「毅硕|生信教程」 micromamba:mamba的C++实现,超越conda
还在为生信软件的安装配置而烦恼?micromamba(micromamba是mamba包管理器的小型版本,采用C++实现,具有mamba的核心功能,且体积更小,可以脱离conda独立运行,更易于部署)帮你解决!
80 1
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
29 1
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
32 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
32 4
|
2月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
2月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)