详解C++编程中类的声明和对象成员的引用

C++类的声明和对象的创建
类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数。

与结构体一样,类只是一种复杂数据类型的声明,不占用内存空间。而对象是类这种数据类型的一个变量,占用内存空间。
类的声明

类是用户自定义的类型,如果程序中要用到类,必须先进行声明,或者使用已存在的类(别人写好的类、标准库中的类等),C++语法本身并不提供现成的类的名称、结构和内容。

一个简单的类的定义:

class Student{
  //成员变量
  char *name;
  int age;
  float score;
  //成员函数
  void say(){
    printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
  }
};

该例创建了一个Student类,它包含了3个成员变量和1个成员函数。

class是C++中的关键字,用于声明一个类;紧接 class 关键字之后的是我们自定义的类名 Student;由{ }包围的是类体。声明类时不能对成员变量进行初始化,只有在创建对象以后才能赋值。

类可以理解为一种新的数据类型,该数据类型的名称是 Student。与 char、int、float 等基本数据类型不同的是,Student 是一种复杂数据类型,可以包含基本类型,而且多了很多基本类型中没有的特性。
需要注意的是:在类声明的最后有一个分号(;),它是类声明的一部分,表示类声明结束了,不能省略。
创建对象

声明了 Student 数据类型之后,就可以用它来定义变量了,如:

Student LiLei; //创建对象

该语句声明了一个名字为 LiLei、数据类型为 Student 的变量。这和:

int a; //定义整形变量

语句定义了一个整型变量表达的意思是类似的。而 LiLei 这个变量我们称之为 Student 类的对象。

在定义类的对象时,class 关键字可要可不要。但出于习惯我们通常都会省略掉class关键字,例如:

class Student LiLei; //正确
Student LiLei; //同样正确

创建类的对象时,除了能定义单个变量以外,还可以定义一个数组或者指针。例如:

Student all_student[100];
Student *pointer;

第一条语句定义了一个 all_student 数组,该数据拥有100个元素,每个元素都是 Student 类型。第二条语句定义了一个 Student 类型的指针 pointer,该指针可以指向 Student 类型的变量(对象),用法和普通指针一样。
声明类的同时创建对象

和结构体(struct)类似,你可以先声明类,然后再创建对象,也可以在声明类的同时创建对象。如下所示:

class Student{
  //成员变量
  char *name;
  int age;
  float score;
  //成员函数
  void say(){
    printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
  }
}stu1, stu2;

这个时候你也可以省略类名,直接创建对象。如下所示:

class{
  //成员变量
  char *name;
  int age;
  float score;
  //成员函数
  void say(){
    printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
  }
}stu1, stu2;

直接定义对象,在C++中是合法的、允许的,但却很少用,也不提倡用。

一个完整的示例:

#include <stdio.h>
//类可以在所有函数之外定义
class Student{
public: //类包含的变量
  char *name;
  int age;
  float score;
public: //类包含的函数
  void say(){
    printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
  }
};
int main(){
  //创建对象
  Student stu;
  stu.name = "小明";
  stu.age = 15;
  stu.score = 92.5f;
  stu.say();
  //定义指针
  Student *pt_stu = &stu;
  pt_stu->name = "李雷";
  pt_stu->age = 16;
  pt_stu->score = 80;
  pt_stu->say();
  return 0;
}

运行结果:

小明的年龄是 15,成绩是 92.500000
李雷的年龄是 16,成绩是 80.000000

public 是C++中的关键字,用来修饰成员变量和成员函数,表示它们是公有的。我们将在下节详细讲解 public,这里只需要知道,只有 public 后面的成员变量和成员函数才能被创建的对象访问到。像本节开头的例子,没有使用 public,那么创建对象后就不能使用任何成员。
main 函数中首先创建了一个对象 stu,然后又定义了一个 Student 类型的指针变量。可以发现,和结构体(struct)类似,一个对象通过成员选择符”.“来访问成员变量和成员函数,而指针变量通过指针操作符”->“来访问成员。

对象指针和结构体指针类似。

注意:对象指针指向的是一个具体的对象,而不是类。下面的写法是错误的:

Student *pt;
pt = &Student;

C++对象成员的引用
在程序中经常需要访问对象中的成员。访问对象中的成员可以有3种方法:

  1. 通过对象名和成员运算符访问对象中的成员;
  2. 通过指向对象的指针访问对象中的成员;
  3. 通过对象的引用变量访问对象中的成员。

通过对象名和成员运算符访问对象中的成员

例如在程序中可以写出以下语句:

  stud1.num=1001; //假设num已定义为公用的整型数据成员

表示将整数1001赋给对象stud1中的数据成员num。其中“.”是成员运算符,用来对成员进行限定,指明所访问的是哪一个对象中的成员。注意不能只写成员名而忽略对象名。

访问对象中成员的一般形式为:
    对象名.成员名
不仅可以在类外引用对象的公用数据成员,而且还可以调用对象的公用成员函数,但同样必须指出对象名,如:

  stud1.display( ); //正确,调用对象stud1的公用成员函数
  display( ); //错误,没有指明是哪一个对象的display函数

由于没有指明对象名,编译时把display作为普通函数处理。应该注意所访问的成员是公用的(public )还是私有的(private ),只能访问public成员,而不能访问private成员。如果已定义num为私有数据成员,下面的语句是错误的:

  stud1.num=10101; //num是私有数据成员,不能被外界引用

在类外只能调用公用的成员函数。在一个类中应当至少有一个公用的成员函数,作为对外的接口,否则就无法对对象进行任何操作。
通过指向对象的指针访问对象中的成员

前面已经介绍了指向结构体变量的指针(详情请猛击:指向结构体变量的指针),可以通过指针引用结构体中的成员。用指针访问对象中的成员的方法与此类似。如果有以下程序段:

class Time
{
public : //数据成员是公用的
  int hour;
  int minute;
};
Time t, *p; //定义对象t和指针变量p
p=&t; //使p指向对象t
cout<<p->hour; //输出p指向的对象中的成员hour

在p指向t的前提下,p->hour,(*p).hour和t.hour三者等价。
通过对象的引用变量来访问对象中的成员

如果为一个对象定义了一个引用变量,它们是共占同一段存储单元的,实际上它们是同一个对象,只是用不同的名字表示而已。因此完全可以通过引用变量来访问对象中的成员。

如果已声明了Time类,并有以下定义语句:

  Time t1; //定义对象t1
  Time &t2=t1; //定义Time类引用变量t2,并使之初始化为t1
  cout<<t2.hour; //输出对象t1中的成员hour

由于t2与t1共占同一段存储单元(即t2是t1的别名),因此t2.hour就是t1.hour。

(0)

相关推荐

  • C++之类和对象课后习题简单实例

    建立一个对象数组,内放5个学生的(学号,成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生的最高成绩者,并输出其学号. #include<iostream> using namespace std; class Student {public: Student(int=10,int=0); int number; int score; void display(); }; Student::Student(int num,int sco):number(num)

  • C++内核对象封装单实例启动程序的类

    复制代码 代码如下: //File Name: Singleton.h#pragma once class Singleton{private:    CString strGUID;    CString strMapFileGUID; HANDLE m_hSingleton; public:    Singleton();    ~Singleton();public:    void AppStart (const HWND & hWnd) const;}; 复制代码 代码如下: //Fi

  • 详解C++编程中的输入输相关的类和对象

    C++输入和输出的概念 我们经常用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.除了以终端为对象进行输入和输出外,还经常用磁盘(光盘)作为输入输出对象,磁盘文件既可以作为输入文件,也可以作为输出文件. 程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件. C++输入输出包含以下三个方面的内容: 对系统指定的标准设备的输入和输出.即从键盘输入数据,输出到显示器

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

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

  • 详解C++编程中类的声明和对象成员的引用

    C++类的声明和对象的创建 类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量:创建对象的过程也叫类的实例化.每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数. 与结构体一样,类只是一种复杂数据类型的声明,不占用内存空间.而对象是类这种数据类型的一个变量,占用内存空间. 类的声明 类是用户自定义的类型,如果程序中要用到类,必须先进行声明,或者使用已存在的类(别人写好的类.标准库中的类等),C++语法本身并不提供现成的类的名称.结构和内容. 一个简

  • 详解C++编程中类的成员变量和成员函数的相关知识

    C++类的成员变量和成员函数 类是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型.类这种数据类型是一个包含成员变量和成员函数的一个集合. 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存空间.但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型,本身不占用内存空间,而变量的值则需要内存来存储. 类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是:成员函数是一个类的成员,出现在类体中,它的作用范围由类来决定:而普通函数是独立的,作

  • 详解C++编程中类模板的相关使用知识

    有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类: class Compare_int { public : Compare(int a,int b) { x=a; y=b; } int max( ) { return (x>y)?x:y; } int min( ) { return (x<y)?x:y; } private : int x,y; }; 其作用是对两个整数作比较,可以通过调用成员函数max和min得到两个整数中的大者和小者. 如果想对两个浮点数(

  • 详解Shell编程之变量数值计算(二)

    OK,数值运算(上)是我看完的一小部分,大概的结束脚本如下:(回顾~~) #!/bin/bash a=$1 b=$2 expr $1 + 1 &>/dev/null if [ "$?" -ne "0" ] then echo "请输入数字" exit 1 fi if [ "$#" -ne "2" ] then echo "请输入两个数字" exit 1 fi echo &q

  • 详解Shell编程之变量数值计算(一)

    如果要执行运算,那就少不了运算符,和其他的编程语言相似,shell也有很多的运算符如下: +.-.:代表着加号 和减号 或者,负号 *./.%:代表着乘号,除号,和取模. **   : 幂运算 ++.-- :表示着增加或者减少,它可以放在前置,也可以放在变量的结尾 !.||.&&.(取反)(或) (and) <.<=.>.>=  :比较符号,小于.小于等于.大于.大于等于 ==.!=.= :相等,不相等, =表示相等于 <<     >> 

  • IOS 详解socket编程[oc]粘包、半包处理

    IOS 详解socket编程[oc]粘包.半包处理 在做socket编程时,如果是做tcp连接,那就不可避免的会遇到粘包与半包的问题,粘包就是多组数据被一并接收了,粘在了一起,无法做划分:半包就是有数据接收不完整,无法处理.要解决粘包.半包的问题,一般在设计数据(消息)格式时会约定好一个字段专门用于描述数据包的长度,这样就使数据有了边界,依靠这个边界,就能把每组数据划分出来,数据不完整时也能获知数据的缺失. (当然也可以把数据设计成定长数据,但这样不够灵活:或者用\n,\r这类字符作为数据划分依

  • 详解C#编程获取资源文件中图片的方法

    详解C#编程获取资源文件中图片的方法 本文主要介绍C#编程获取资源文件中图片的方法,涉及C#针对项目中资源文件操作的相关技巧,以供借鉴参考.具体内容如下: 例子: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.Drawing; namespace CL { public class RES { /

  • 详解python编程slice与indices函数用法示例

    一般来说,内置的slice()函数会创建一个切片对象,可以用在任何允许进行切片操作的地方. 下面是slice的简介: # slice 两种用法 class slice(stop) class slice(start, stop[, step]) 返回一个表示由 range(start, stop, step) 所指定索引集的 slice对象. 其中 start 和 step 参数默认为 None. 切片对象具有仅会返回对应参数值(或其默认值)的只读数据属性 start, stop 和 step.

  • 详解js中的原型,原型对象,原型链

    理解原型 我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法.看如下例子: function Person(){ } Person.prototype.name = 'ccc' Person.prototype.age = 18 Person.prototype.sayName = function (){ console.log(this.name); } var person1 = ne

  • 详解如何解决使用JSON.stringify时遇到的循环引用问题

    程序员在日常做TypeScript/JavaScript开发时,经常需要将复杂的JavaScript对象通过JSON.stringify序列化成json字符串,保存到本地以便后续具体分析. 然而如果JavaScript对象本身包含循环引用,则JSON.stringify不能正常工作,错误消息: VM415:1 Uncaught TypeError: Converting circular structure to JSON 解决方案,使用下面这段来自这个网站的代码,定义一个全局cache数组,每

随机推荐