天天看点

C++部分——C++面向对象(1)

1.描述面向对象技术的基本概念

面向对象是人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析,设计,实现软件的方法,包括类,对象,消息以及类的特性等方面的内容。

2.C++与C语言相比的改进

C++是从C语言发展演变的。C语言是过程式编程语言,它以过程为中心,以算法为驱动。而C++能够使用面向对象的编程方式,即使用以面向对象为中心,以消息为驱动的编程方式。这是C++在C语言上面的最大改进。

3.class和struct有什么区别

分为以下两种情况:

C语言的struct与C++的class的区别:struct只是作为一种复杂数据类型定义,不能用于面向对象编程;

C++中的struct与class的区别:对于成员访问权限以及继承方式,class中默认的是private的,而struct中则是public的。class还可以用于表示模板类型,struct则不行。

4.改错——C++类对象的声明

struct Test
{
     Test(int){}
     Test(){}
     void fun(){}
};
void main(void)
{
    Test a();
    a.fun();
    Test b();
    b.fun();
}
           

题中的Test有两个构造函数,其中一个是带参数的,而另一个是不带参数的。在调用不带参数的构造函数时不需要加小括号,因此代码第12行是错误的。应该改成:

Test b;//去掉小括号

5.看代码写结果——C++类成员的访问

(类对象的私有成员函数不能用对象访问)

#define public private   //(1)
class Animal
{
public :                 //(2)
    void MakeNoise();
};
int main(void)
{
    Animal animal;
    animal.MAkeNoise();//(3)
    return ;
}
           

(1)正确。把public宏定义为private;

(2)正确。定义public成员。注意,由于public已经被定义为private,因此这里的MakeNoise()成员函数实际上是private。

(3)错误。调用Animal对象的私有成员函数。

6.找错——类成员的初始化

#include<iostream>
using namespace std;
class Obj{
public :
    Obj(int k):j(k),i(j);
    {
    }
    void printf(void)
    {
        cout<<i<<endl<<j<<endl;
    }
private:
    int i;
    int j;
};
int main(int argc,char *argv[])
{
    Obj obj();
    obj.print();

    return ;
}
           

本题考查的是初始化列表方面的知识。这里很容易让人以为先用2对j进行初始化,然后用j对i进行初始化,那么i和j都是2.

实际上,初始化的顺序正好与想象的相反。初始化列表的初始化顺序与变量声明的顺序一致,而不是按照出现在初始化列表中的顺序。这里的成员i比成员j先声明,因此正确的顺序是先用j对i进行初始化,然后用2对j进行初始化。由于在对i进行初始化时j尚未被初始化,j的值为随机值,故i的值也为随机值;然后用2对j进行初始化,j的值为2.

7.静态成员变量的使用(看代码,写结果)

#include<iostream>
using namespace std;
class Myclass
{
public :
    Myclass(int a,int b,int c);
    void GetNumber();
    void GetSum();
private:
    int A;
    int B;
    int C;
    int Num;
    static int Sum;
};

int Myclass::Sum=;

Myclass::Myclass(int a,int b,int c)
{
    A=a;
    B=b;
    C=c;
    Num=A+B+C;
    Sum=A+B+C;
}
void Myclass::GetNumber()
{
    cout<<"Number="<<Num<<endl;
}
void Myclass::GetSum()
{
    cout<<"Sum="<<Sum<<endl;
}

void main()
{
    Myclass M(,,),N(,,);

    M.GetNumber();
    N.GetNumber();
    M.GetSum();
    N.GetSum();
}
           

本题考查的是静态成员与非静态成员的区别。静态成员被当作该类类型的全局变量。对于非静态成员,每个类对象都有自己的复制品,而静态成员对每个类的类型只有一个复制品。静态成员只有一份,由该类类型的所有对象共享访问。

MyClass类中有GetNumber()和GetSum()两种方法,它们分别输出成员变量Num和Sum的值。main函数中定义了两个Myclass的对象,并调用它们的GetNumber()和GetSum()方法。

Num成员为普通类型,它为Myclass类的对象所有。因为两次打印的值不一样。

Sum成员为静态类型,它为Myclass类所有,被Myclass类的所有对象共享。因此,两次打印出来的值是相同的。

答案如下:

Number=20

Number=34

Sum=34

Sum=34

8.与全局对象相比,使用静态数据成员有什么优势

优势如下:*1.静态数据成员没有进入程序的全局名字空间,因此不存在程序中其他全局名字冲突的可能性;

*2.使用静态数据成员可以隐藏信息。因此静态成员可以是private成员,而全局对象不能。

继续阅读