[C++ 从入门到精通] 7.类基础、成员函数、对象拷贝

简介: [C++ 从入门到精通] 7.类基础、成员函数、对象拷贝

一. 综述

C++中,我们使用“类”来描述“对象”,它是用户自己定义的数据类型,可以说“类”的实现是C++OOP的核心。

那么设计类时要考虑哪些问题

  1. 站在设计者和实现者的角度来考虑:考虑类中数据的存储和布局,有哪些必要的成员变量和成员函数等。
  2. 站在使用者的角度来考虑:哪些接口需要对使用者开放;哪些接口不对外分开放,只供自己内部使用。
  3. 含有继承关系的子类和父类应如何设计:比如设计一个车子父类,那么可能会有很多譬如卡车、轿车等子类,这时需要将这些车子的公共特性(比如都走机动车道、都是油驱等)抽取出来放到车子父类中,然后不同的车分别在子类中实现。子类可能不具有父类所有的属性和方法,也可能具有基类所没有的属性和方法。

二. 类基础

1、类的定义:C++中使用关键字class来定义类,如下:

class student
{
public:   //公共的行为或属性:内部可以使用,外界也可以访问或者调用
    string name;
    int num;
    void getStudentNum();
private:  //私有的行为或属性:只能被本类内部成员函数访问,不能被外部所访问或调用
     int age;
     void getStudentAge();
};

2、类的构成:

  • 成员变量:namenumpublic),ageprivate)。
  • 成员函数:getStudentNum()public),getStudentAge()private),此外,还有许多特殊成员函数,后面在慢慢讲解。

一般来说类的属性成员都应设置为privatepublic只留给那些被外界用来调用的函数接口, 但这并非是强制规定, 可以根据需要进行调整。

3、类成员的访问:

访问类成员时,如果是类的对象,使用对象名.成员名来访问成员;如果是指向这个对象的指针,使用指针名->成员名来访问成员。

student stu;
stu.num = 100;     //如果是类的对象,使用`对象名.成员名`来访问成员
student *pStu = &stu;
pStu->num  = 200;  //如果是指向这个对象的指针,使用`指针名->成员名`来访问成员

4、类和结构的区别:

结构struct是成员默认为public的类class,类class成员默认是private。为了便于记忆,可以理解struct比较开放,class比较保守。

struct A
{
   int num;  //未定义属性默认:public
};

上面的结构定义等价于下面的类定义

class B
{
public:
   int num;  //要定义public,否则默认是private
}

虽然类和结构全部定义访问属性后等价,但是不建议类和结构混用。一般只有成员变量没有成员函数时可以用结构struct定义,有成员函数可以定义成类class,虽然这不是必须的,但是得有一个我们自己的标准来判断使用struct定义还是class,不要想用哪个用哪个。


三. 成员函数

C风格初始化类成员变量:

class Time
{
public:
  int Hour;
  int Minute;
  int Second;
};
void initTime(Time &stmptime, int tmphour, int tmpmin, int tmpsec)
{
  stmptime.Hour = tmphour;
  stmptime.Minute = tmpmin;
  stmptime.Second = tmpsec;
}
int main()
{
  Time  myTime;   //类对象
  initTime(myTime, 11, 14, 5);  //初始化类对象
}

上面写法我们可以看到类Time和函数initTime并没有什么直接的联系,只是在主函数中调用了initTime函数初始化了类Time中的成员。因为是initTime函数初始化了类Time中的成员,理论上两者肯定是有关系的,只是我们的这种写法使得两者没有什么关系,那么如何使两者关联起来呢?

C++风格初始化类成员变量(使用成员函数):

class Time
{
public:
  int Hour;
  int Minute;
  int Second;
  void initTime(int tmphour, int tmpmin, int tmpsec)  //成员函数,实现也可以放在.cpp中
  {
    Hour = tmphour;
    Minute = tmpmin;
    Second = tmpsec;
  }
};
int main()
{
  Time  myTime;   //类对象
  myTime.initTime(11, 14, 5);  //初始化类对象
}

四. 对象的拷贝

类对象本身是可以拷贝的,如:

Time  myTime;   //类对象
myTime.Hour = 12;
myTime.Minute = 30;
myTime.Second = 20;
//对象拷贝(初始化另一对象)
Time  myTime2 = myTime;     //方式一,值拷贝,内存不同
Time  myTime3( myTime );    //方式二,值拷贝,内存不同
Time  myTime4{ myTime };    //方式三,值拷贝,内存不同
Time  myTime5 = { myTime }; //方式四,值拷贝,内存不同

默认情况下,这种类对象的拷贝,是每个成员变量逐个拷贝。如果我们在类Time中定义适当的赋值运算符,是能够控制对象的拷贝行为的,就不会逐个拷贝了(后面讲)。


下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。


目录
相关文章
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
61 2
|
2月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
111 5
|
2月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
111 4
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
148 4
|
3月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
35 4
|
3月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
33 4
|
3月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
30 1
|
3月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
3月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
3月前
|
存储 编译器 C语言
【C++类和对象(上)】—— 我与C++的不解之缘(三)
【C++类和对象(上)】—— 我与C++的不解之缘(三)