上一篇将C++基本类概念解决了,接下来讲述两个重要概念,就是C++对象有属性和函数,那么如何访问呢?通常比喻CStudent 有一个name属性,那么student1对象可以用student1.name来访问这个属性。那么如果在函数中怎么访问呢?特别是如果函数中有与属性同名的局部变量或者形参,那么怎么解决这个问题呢?这就用到this指针,this 指针不是指向函数或者类地址,而是指向对象地址。如下例所示:

void CStudent::input(char * name,int score) //实际上这里隐含了一个this 指针 (Cstudent *this, char*name,int score)

{

  name = name; //显然从语法上这种就是错误,主要就是因为不能区分这个name具体是指哪一个,使用this->name = name;

  score = score; //显然从语法上这种就是错误,主要就是因为不能区分这个name具体是指哪一个,使用this->name = name;

}

C++默认提供了一个this指针,可用于成员函数中,用于区别形参与数据成员,但是一定要注意,静态成员函数是不能使用this指针的。这最后一点现在不说,后面讲到静态成员函数是怎么初始化就知道了。它在初始化还没有this指针地址,所以就不行。前面讲到构造函数时,可以有多个构造函数,构造函数可以有不同的形参。那么我们来思索一个问题,就是声明了一个类,比喻说Cstudent,同时定义了两个对象student1,student2,如果我们要想让student1=student2怎么做?或者简单的说将student2赋值给student1怎么做?简单变量如我们声明int a =12; int b =a;可以直接使用赋值符号进行拷贝。在C++中为了支持这种特性,对类设计了一个拷贝构造函数。这个构造函数同默认的构造函数一样,是系统必须要求的。这个函数的基本功能就是能让我们实现赋值功能。拷贝构造函数的基本格式如下 CStudent(const CStudent &stu) ,这里需要注意三点,第一点就是const一定要有,否则的话,因为是引用传进来,会导致在函数内部更改,影响外部更改,就使得两边赋值不同。那么这里&是否一定要呢?一定要的,同样的道理,如果不是传引用,那么当两个对象赋值时,会反复不停的调用构造函数。下面是实验代码:

#pragma once
class Student
{
private:
    char m_name[20];
    int m_age;
public:
    Student(void);
    Student(char name[20],int age);
    Student(const Student &student);
    ~Student(void);
    void initialize(char *name,int age);
    void output();
};

#include "Student.h"
#include <iostream>


Student::Student(void) //缺省构造函数
{
    strcpy(m_name," ");
    m_age = 0;
}
Student::Student(char *name,int m_age) //带参数的构造函数
{
    strcpy(m_name,name);
    this-&gt;m_age=m_age;
}
Student::Student(const Student &stu) //拷贝构造函数
{
    strcpy(this-&gt;m_name,stu.m_name);
    this-&gt;m_age=stu.m_age;
}

Student::~Student(void) //析构函数
{
    std::cout<&lt;"Deconstruct code"&lt;&lt;std::endl;
}

void Student::initialize(char *name,int age)
{
    strcpy(m_name,name);
    m_age = age;
}
void Student::output()
{
    std::cout&lt;&lt;m_name&lt;&lt;"  "&lt;&lt;this->m_age<&lt;std::endl;
}

int main(void)
{
    Student stu1;
    Student stu2("Tom",23);
    Student stu3("referenecm",23);
    Student stu4("copyconstruct",11);
    Student stu5(stu4); //拷贝构造赋值
    Student *p;
    Student *newp =0;  //指针
    Student *newparry = new Student[2]; //指针数组
    Student &rstu = stu3; //引用
    p = &stu2;   //
    newp = new Student("newcreatename",13); //在堆上创建对象
    Student stu[3]={Student("Alice",12),Student("HelloName",32)}; //对象数组
    stu1.output();
    stu2.output();
    stu2.initialize("WOCAO",12);
    stu2.output();
    for(int i =0;i&lt;3;i++)
    {
        //stu[i].initialize("test",12);
        stu[i].output();
    }
    p->output();
    (*p).output();
    rstu.output();

    newp-&gt;output();
    delete newp;

    newparry[0].output();
    delete []newparry;
    stu4.output();
    stu5.output();
    system("pause");

}

前面我们讲到了使用this指针进行对象属性访问。默认情况下,对象之外的对象想要访问该对象,必须通过对象的公共方法进行访问,是不能访问私有属性的。不过在C++中还有一种特例,就是友元函数和友元类,通过友元将一个类与另一个类或函数之间关系声明为友元关系,其目的就是让友元对象可以被访问到。其定义声明格式如下:

【1】友元函数 一个函数不是本类的函数,但是可以访问本类的成员,格式为friend void visit()

#include <iostream.h>

class CStudent

{

public:

friend CStudent &visit(CStudent &student,char *name,int score);

private:

       char *m_name;

        int m_score;

};

CStudent &visit(CStudent &student, char* name,int score) //这个函数不是类成员函数,外部函数

{

strcpy(student.m_name,name);  //m_name从类属性上是私有的,默认是不能访问的。但因为是友元函数。

student.m_score = score;

return student;

}

void main()

{

  CStudent stu;

   visit(stu,”TOM”,79);

}

【2】友元类 一个类的所有成员能访问另一个类的所有成员,我们称这个类是另一个类的友元类。声明格式: friend class 类名;

#include <iostream.h>

Class CStudent

{

public:

         friend class CTeacher;

private:

        char *m_name;

          int m_score;

};

Class CTeacher

{

public:

   CStudent &visit(CStudetn &student, char *m_name,int age);

}

CStudent &CTeacher:visit(CStudent &student,char *name,int score)

{

strcpy(student.m_name,name);

studetn.m_score =score;

return student;

}

void main()

{

CStudent stu;

  CTeacher tech1;

tech1.visit(stu,”TOM”,79);

}