C++ 语法基础(四)(二)

简介: C++ 语法基础(四)(二)

使用对象

类与对象的关系:类型与变量的关系


对象定义


直接在程序中定义某个类的对象,各种定义方式与行为与各种数据类型相似。

//存储类别  类名  对象列表;
DoubleArray arr1, arr2;
static DoubleArray  array[10];
Rational  *rp;
rp = new Rational;     
delete  rp;
rp1 = new Rational[20]; 
delete [] rp1;

对象的使用


对象的使用是使用它的成员:公有成员可以被任何函数使用,私有成员只能被自己的成员函数使用。


成员的引用:


/*
对象名.数据成员名
对象指针->数据成员名    
对象名.成员函数名(实际参数表) 
对象指针->成员函数名(实际参数表) 
*/
arr1.storage = 0; 
rp->num = 1;
arr1.insert(5, 3.7);   
rp->add(r1, r2);

this指针

每个成员函数都有一个隐藏的指向本类型的指针形参this,指向控制对象


如对函数:


void create(int n, int d) { num = n; den = d;}


经过编译后,实际函数为:


void create(Rational *this, int n, int d) { this->num = n; this->den = d;}


通常,在写成员函数时可以省略this,编译时会自动加上它们。


如果在成员函数中要把对象作为整体来访问时,可以显式地使用this指针。


填空题


为以下的类实现一个add函数:

class SampleClass
{
    int a;
public:
    SampleClass add()
    {
        /*
        此处是你需要填的内容
        这个函数实现了将变量a增加1的功能
        最后返回增加1前的对象(不要求地址相同)
        */
        SampleClass temp=*this;
        a++;
        return temp;
    }
}

对象的构造与析构

变量可以在定义时赋初值,对象能赋初值吗?怎么赋?


将赋初值的过程写成一个函数,让计算机在定义对象时执行该函数,这个函数称为构造函数


同理,有时在对象消亡前也有些工作要做,可将该过程写成一个函数,让计算机在对象消亡时执行该函数,这个函数称为析构函数


构造函数和析构函数是特殊的成员函数


image.png


构造函数

构造函数说明了定义对象时,如何为对象赋初值,由系统在定义对象时自动调用。构造函数的名字必须与类名相同


如果没有给类定义构造函数,编译系统会自动生成一个缺省的构造函数。它只为对象分配存储空间,空间中的内容为随机数。


构造函数可以有任意类型的参数,也可以不带参数,但不能具有返回类型。构造函数可以重载。

class SampleClass
{
public:
    SampleClass(/*...*/){/*...*/}
}

不带参数的构造函数称为默认的构造函数,一般每个类应该有一个缺省的构造函数。


对象定义的一般形式:类名 对象名(实际参数表);


实际参数表必须与某个构造函数的形式参数表相对应,除非这个类有一个构造函数是没有参数的,那么可以用:类名 对象名;


image.png


析构函数

析构函数在销毁对象时,完成一些善后工作(如,归还分配给指针的空间),由编译系统自动调用


析构函数与构造函数名字相同,但它前面加一个波浪号(~),析构函数没有参数、返回值,也不能重载。


若定义类时没有定义析构函数,编译系统会自动生成一个缺省的空析构函数

class SampleClass
{
    int value;
    int *pointer;
public:
    SampleClass(int a,int b):value(a)
    {
        pointer=new int(b);
    }
    ~SampleClass()
    {
        delete pointer;
    }
}
可以利用析构函数与构造函数来验证对象的生命周期
//为下面的类构建一个析构函数,其中指针`arrays`指向了一个数组。
#include <bits/stdc++.h>
using namespace std;
class SampleClass
{
private:
    const int key;
    string *value;
  int *arrays;
public:
  SampleClass(int key_, string val_, int n) : key(key_)
  {
  value = new string(val_);
  arrays = new int[n];
  }
  ~SampleClass()
  {
  delete value;
  delete [] arrays;
  }
  void print(){
  printf("%d\n", key);
  cout << *value << endl;
  }
};
int main(){
    SampleClass a(321, "hello world", 5);
  a.print();
}


相关文章
|
12天前
|
编译器 C++ 容器
C++语言的基本语法
想掌握一门编程语言,第一步就是需要熟悉基本的环境,然后就是最重要的语法知识。 C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。 类 - 类可以定义为描述对象行为/状态的模板/蓝图。 方法 - 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。 即时变量 - 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。 完整关键字
29 2
|
1月前
|
Java 编译器 程序员
C++中的语法知识虚继承和虚基类
**C++中的多继承可能导致命名冲突和数据冗余,尤其在菱形继承中。为解决这一问题,C++引入了虚继承(virtual inheritance),确保派生类只保留虚基类的一份实例,消除二义性。虚继承通过`virtual`关键字指定,允许明确访问特定路径上的成员,如`B::m_a`或`C::m_a`。这样,即使基类在继承链中多次出现,也只有一份成员副本,简化了内存布局并避免冲突。虚继承应在需要时提前在继承声明中指定,影响到从虚基类派生的所有后代类。**
44 7
|
1月前
|
编译器 C++ 开发者
C++一分钟之-属性(attributes)与属性语法
【7月更文挑战第3天】C++的属性(attributes)自C++11起允许附加编译器指令,如`[[nodiscard]]`和`[[maybe_unused]]`,影响优化和警告。注意属性放置、兼容性和适度使用,以确保代码清晰和可移植。示例展示了如何使用属性来提示编译器处理返回值和未使用变量,以及利用编译器扩展进行自动清理。属性是提升代码质量的工具,但应谨慎使用。
49 13
|
2月前
|
编译器 程序员 C++
C++一分钟之-属性(attributed)与属性语法
【6月更文挑战第28天】C++的属性为代码添加元数据,帮助编译器理解意图。C++11引入属性语法`[[attribute]]`,但支持取决于编译器。常见属性如`nodiscard`提示检查返回值,`maybe_unused`防止未使用警告。问题包括兼容性、过度依赖和误用。使用属性时需谨慎,确保团队共识,适时更新以适应C++新特性。通过示例展示了`nodiscard`和`likely/unlikely`的用法,强调正确使用属性能提升代码质量和性能。
52 13
|
2月前
|
编译器 C语言 C++
|
2月前
|
存储 自然语言处理 编译器
【C++语言1】基本语法
【C++语言1】基本语法
|
3月前
|
编译器 C语言 C++
C++的基本特性和语法
C++的基本特性和语法
46 1
|
3月前
|
存储 C++ 容器
【C++从练气到飞升】09---string语法指南(二)
【C++从练气到飞升】09---string语法指南(二)
|
3月前
|
存储 Linux C语言
【C++从练气到飞升】09---string语法指南(一)
【C++从练气到飞升】09---string语法指南(一)