C++中类的细节说明

原创 2016年08月30日 11:58:45



1、前言


C++中提供了一种抽象数据类型的能力,就是类。通过定义类,可以方便的理解各种现实生活中有实际意义的抽线模型,方便开发中进行调试,编写和修改程序。类可以隐含自己的成员不被外界访问也可以开放自己的成员使得外界可以访问,这就构成了很好的封闭模式。接下来,会对类的作用域,构造函数,this指针以及友元函数,可变成员和静态成员进行描述,这些都是定义类的细节。


2、类的组成部分


2.1类成员

类中可以定义数据成员也可以定义函数成员,可以使用访问修饰符修饰它们,比如使用private就使得它们只能在类里面被访问。对于成员的数量并没有要求,我们需要根据实际类型去定义。


2.2构造函数初始化列表

构造函数初始化列表,一般是以构造函数名称+形参表+:+成员变量(初始值)组成。看下面代码:

<pre name="code" class="cpp">class Person
{
private:
       Person():name("hy"),age(20){}
public:
        string name;
        int age;

}

2.3成员函数的声明和定义

在类内部声明成员函数是必须的,而成员函数的定义则是可选的。如果在类的内部定义成员函数,相当于内联函数,在类的外部定义函数,则必须声明函数的作用域,即该函数属于哪个类。
<pre name="code" class="cpp">class Person
{
private:
       Person():name("hy"),age(20){}
public:
        string name;
        int age;
        void addAge()
         {
             age++;
         }//等同于内联函数

}

//外部定义函数必须声明类空间int Person::getAge(){return age;}

2.4同一类型的数据成员

如果一个类含有多个同一类型的数据成员,则这些数据成员可以在同一行中声明:
class Person
{
private:
       Person():name("hy"),age(20){}
public:
        string name;
        int age,height;//同一行声明数据成员
        void addAge()
         {
             age++;
         }//等同于内联函数

}


2.5类内部使用别名简化操作

如果在一个类的内部,有些数据类型比较复杂,可以给他们定义一个别名,这样就可以大大简化操作了。

class Person
{
private:
       Person():name("hy"),age(20){}
      
public:
        string name;
        int age,height;//同一行声明数据成员
        void addAge()
         {
             age++;
         }//等同于内联函数
         //使用别名简化操作
        typedef std::string::size_type index;
         index size_type;

}


2.6显示指定成员函数为内联函数

在类内部定义的函数默认是内联函数,这样在调用该函数的时候,编译器将试图在同一行中将其拓展。或者我们也可以显示的用inline修饰函数为内联函数:


class Person
{
private:
       Person():name("hy"),age(20){}
public:
        string name;
        int age;
        void addAge()
         {
             age++;
         }//等同于内联函数

}



//外部定义函数必须声明类空间
inline int Person::getAge()//显示声明内敛函数
{
return age;
}

注意内联函数不应该过于复杂并且它的定义最好和类在同一个头文件中。


3、隐含的this指针

成员函数含有一个附加的this指针形参,用于指向调用对象。和一般的指针一样,我们可以调用它来解引用获得成员变量的值。也可以使用它来操作调用对象的整体。比如:


class Person
{
private:
       Person():name("hy"),age(20){}
public:
        string name;
        int age;
        void addAge()
         {
             age++;
         }//等同于内联函数

}



//外部定义函数必须声明类空间
inline int Person::getAge()//显示声明内敛函数
{
return age;
}

//使用隐含的this指针
Person& Pserson::setAge(int age)
{
this->age=age;
return this;
}


4、以const结尾的成员函数


一般的成员函数的this指针是一个指向非const数据类型的const指针,即可以该表this指向的对象的成员变量的值,但是不可以修改this指针指向的值。如果我们希望声明一个指向const类型的const指针的话,可以用const修饰函数:

string Person::displayName() const
{
return name;
}

这样子的话,就不可以通过this指针去修改任何Person对象的数据成员了。



5、可变数据成员


如果一个成员函数被声明为const函数,那么我们是不能通过this指针去修改成员变量的。但是如果类中有些成员变量,无论什么状态下都应该是可以改变的,怎么定义呢。可以用multable修饰符修饰它,这样无论函数是否为const,都可以修改它的值。

class Person
{

private:
         multable int height;
         string name;
}

string  Person::getName(int height)const
{
height++;
return name;
}

例子不重要,关注的是用法,可以看到即使是const成员函数,由于height用multable声明了,所以仍然是可以改变的。



6、使用类的成员


访问类的结构成员可以使用成员操作符和指针操作符。

pPerson->name;

person.name;


7、构造函数


构造函数的目的是初始化成员变量,每个类都会有一个构造函数,同时我们也可以重载构造函数。C++中的构造函数不能是const函数,因为构造函数本身就是用来修改值得。

person();

person(const &istream);

person(const &name);


8、构造函数初始化列表

考虑下面两种初始化方法:

person(string name):name(name),age(20){}

person(string name)
{
this->name=name;
}

上面两种方法都可以给name赋值,不同的地方在于,第一种使用了构造函数初始化式,是直接在创建对象的时候就给成员变量进行值的初始化。后面这种严格意义来说是赋值初始化,因为在调用后面这种构造函数的时候,person对象已经建立了并且他的成员变量都有了默认的值,只是后来我们有重新修改了成员变量的数据而已。虽然两者的结果是一样的但是过程却不同。因为这种特性,如果类中包含的成员变量没有默认构造函数的话,就一定要用构造函数初始化式进行显示初始化,而不可以使用复制初始化的方式。



9、调用无参默认构造函数的错误实例

如果我们没有给类显示声明一个构造函数,那么编译器会给我们生成一个无参的默认构造函数。当我们调用无参默认构造函数的时候,切记不要加()。


Person person();
cout<<person.name;

Person person;
cout<<person.name;

上述两种写法,只有第二种才是对的,第一中编译器不会把它当作一个对象的定义,而是当作一个函数的声明。



10、友元函数,友元类


我们知道,一个类的成员变量声明为private的时候,外界是不允许访问它们的。比如,我在Display类中有如下方法:

void Dispaly::printlnName(Person &person)
{
cout<<person.name;
}

假设name是person的私有变量,那么上述的方法行不通的,为了让该方法可以访问persond的私有变量,需要将该函数声明为友元函数:


class Person
{
friend Display::printlnName(Person &person);
//......}

这样Display类的printlnName函数就可以访问Person的私有成员了。如果我们想让Display整个类都可以访问私有成员函数,可以:

class Person
{
friend class Display;
//......}

这样,Display的任何函数都可以访问Person的私有成员了。




11、static静态成员


我们只需要知道一点,静态成员是和类关联的,而不是和类的对象关联的,所以,就衍生除了很多特性。比如每次通过类的对象操作静态成员的时候,即使这些类的对象是不一样的,但是它们操作的静态成员是一样的。

Person
{
static string name;
//......
}

Person person1;
Person person2;

我们用person1,person2去访问静态成员name,得出的结果是一样的。

因为静态成员和类的对象没有关系,所以,如果声明了一个静态函数,是没有隐含的this指针的。

Person
{
//.......
public:
static Person& getPerson()
{
return this;
}
}


上面的写法是错的,因为getPerson是静态方法,它不和具体的对象绑定,所以是没有隐含的操作对象的。



关于类的细节就是这么多了,很简单,但是很容易被忽略,所以需要反复记忆。


---------文章写自:HyHarden---------

--------博客地址:http://blog.csdn.net/qq_25722767-----------


版权声明:本文为博主原创文章,未经博主允许不得转载。

写给菜鸟:发CSDN博文常见问题处理

CSDN上发博文,尤其是有代码的,要用好“插入代码”功能(见下图)。这是必须的,未来的IT程序员,需要用这种方式,展示出自己的代码。这是尊重读者,树立品牌的需要。    相关方法,参考见视频《发布第一...
  • sxhelijian
  • sxhelijian
  • 2012年10月06日 08:08
  • 12402

C++之离港篇学习笔记之引用

一、引用(起别名)         引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一...
  • u011391629
  • u011391629
  • 2016年06月22日 15:57
  • 333

C++ 面向对象(一)—— 类(Classes)

类(class)是一种将数据和函数组织在同一个结构里的逻辑方法。定义类的关键字为class ,其功能与C语言中的struct类似,不同之处是class可以包含函数,而不像struct只能包含数据元素。...
  • zqixiao_09
  • zqixiao_09
  • 2016年05月22日 12:35
  • 14931

C++中类的组合

今天时间匆忙,明天整理后写出
  • u014158041
  • u014158041
  • 2014年03月19日 21:53
  • 2526

C++中类与对象的讲解(通俗易懂)

概念 描述 类成员函数 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。 类访问修饰符 类成员可以被定义为 public、private 或 pro...
  • songkai320
  • songkai320
  • 2016年07月14日 20:09
  • 13703

C++类和类的定义

原文出处:http://www.yesky.com/22/194022.shtml  在面向对象的程序设计中,有经常接触类、对象等专业名词;到底什么是类、什么是对象呢?在程序又是怎样运用呢?类是...
  • root_robot
  • root_robot
  • 2016年10月08日 22:32
  • 1452

C++类的构成

C++语言的类对不同成员(数据成员和成员函数)定义了3个可视的层次:private段(缺省,只有类中的成员函数可以访问该段的成员;public段,类中成员函数、类中的对象、派生类的成员函数及对象都可以...
  • SmalOSnail
  • SmalOSnail
  • 2016年11月14日 20:14
  • 1201

C++ 类详解

面对对象:面对将系统看成通过交互作用来完成特定功能的对象的集合。每个对象用自己的方法来管理数据。也就是说对象内部的代码能够操作对象内部的数据。   特点:(抽象)——灵活性       继承——...
  • ky_heart
  • ky_heart
  • 2017年02月09日 09:13
  • 2951

第十二周 项目一-图基本算法库

/* *2015,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:graph.cpp *作者:邱暖 *完成日期:2015年11月16日 *问题描述:定义...
  • q6826
  • q6826
  • 2015年11月16日 16:40
  • 130

3D图形学编程基础-基于Direct3D11-学习记录(二)光照模型的实现

为了让绘制出的物体更接近真实世界,此章引入光照,光照章节不少都是概念论述以及少量的计算方式 和光照有关几个小概念,1,光照:方向,强度,衰弱      2.物体材质:光滑度,折射率,反射率和发光度等;...
  • u011207871
  • u011207871
  • 2016年08月24日 14:21
  • 187
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中类的细节说明
举报原因:
原因补充:

(最多只允许输入30个字)