C++ 类基础知识

来源:互联网 发布:中国古代星象学 知乎 编辑:程序博客网 时间:2024/06/03 15:16

一,抽象与类

生活中充满复杂性,处理复杂性的方法之一是简化与抽象。抽象就是将问题的本质提取出来,并根据特征来描述问题。C++中的类是一种将类转化为用户定义类型的C++工具,它将数据表示与操作数据的方法合成一个完整的包。类是对象的抽象,对象是类的具体化。


二,什么是接口?

接口是一个共享的框架,供两个系统交互时使用。Java中使用jdbc来链接数据库,不同的数据库有不同的驱动程序,使用jdbc可以封装这些不同,然后提供给用户一个统一的进行数据库操作的接口。


三,访问控制

C++提供了三个关键字public、private、protected,它们描述了对类成员的访问控制。

1,private:只能由该类中的函数或其友元函数访问。在类外不能访问,该类的对象也不能访问。
2,protected:可以被该类中的函数、子类的函数或其友元函数访问。在类外不能访问,该类的对象也不能访问。
3,public:可以被该类中的函数、子类的函数或其友元函数访问,也可以由该类的对象访问。


四,结构与类之间的区别

实际上,C++对类进行了扩展,使之具有与类相同的特征。它们之间的唯一的区别就是,结构的默认访问类型是public,而类的默认访问类型是private。C++程序员通常使用类来实现类描述,而把结构限制为只表示纯粹的数据对象。


五,构造函数与析构函数

下面提供了一个类的定义:

class Person{private:    string name;    int age;public:    Person();    Person(const string &name, int age);    ~Person();};

1,构造函数

语法:构造函数名与类名相同,并且没有返回值,可以进行重载。

作用:创建类对象并对类对象的非静态数据成员进行初始化。

注意:

(1),无法使用对象来调用构造函数,因为在构造函数构造出对象之前对象是不存在的。因此,构造函数被用来创建对象,而不能通过对象来调用。

(2),如果没有提供任何构造函数,C++将提供默认的构造函数。它是默认构造函数的隐式版本,不做任何工作。如果为类提供了构造函数,此时编译器不会生成默认的构造函数。因此,为类定义了构造函数,就要为它提供默认的构造函数。

(3),调用默认构造函数,不能使用圆括号。

Person zhangsan(); //定义了一个返回值类型为Person的方法Person lisi;  //调用默认的构造函数

(4),成员初始化列表只能应用于构造函数。


2,析构函数

语法:在类名前加~,没有返回值,也没有参数。

作用:当一个对象的生命周期结束时,程序会自动的调用一个特殊的成员函数--析构函数,来完成一些清理工作。如果程序员没有提供析构函数,编译器将隐式地声明一个默认的析构函数。


六,this指针

1,什么是this指针?

this是指向实例化对象的一个指针,里面存储的是对象的地址,通过this可以访问内部的非静态成员变量与方法。每个非静态成员函数都有一个this指针(包括构造函数与析构函数),this指向调用对象。


2,this指针的作用

this的作用域是在类的内部,声明类时还不知道实例化对象的名字,所以使用this来使用对象。this指针指向用来调用成员函数的对象,在调用对象的非静态函数时,this作为隐藏的参数传给该方法。

obj.fun(1); 等价于 obj.fun(&obj, 1);


3,在什么地方使用this指针?

a,在类的非静态成员函数中返回对象本身时,直接使用return *this。(常用于运算符重载、赋值构造函数、拷贝构造函数)

b,函数的形参名与成员变量名相同时

Person::Person(const string &name, int age){    this->name = name;    this->age = age;}


七,类作用域

在C++中引入了一种新的作用域即类作用域。在类中定义的名称的作用域(成员函数与数据成员)都为整个类,作用域为类的名称在类中是可见的,但是在类的外面是不可见的。因此,可以在不同的类中使用相同的名称,而不会引起冲突。

1,类作用域意味着不能从类的外面直接访问类成员,公有的成员函数也是如此。也就是说,要调用公有的成员函数,必须通过类对象。同样,在定义成员函数时,必须使用作用域解析运算符。

2,作用域为类的常量

下面的声明方式是错误的:

class Person{private:    const int Months = 12;    double cost[Months];    string name;    int age;

上面的做法是错误的,类声明只是描述了对象的形式,并没有创建对象。因此,将没有用于存储的空间。C++11提供了成员初始化,但是不适用于前面的数组声明。可以使用下面2种方式实现这个目标,效果相同。

(1),在类中声明一个枚举。在类声明中声明的枚举的作用域为整个类,因此可以用枚举为整型常量提供作用域为整个类的符号名称。

class Person{private:    enum {Months = 12};    double cost[Months];    string name;    int age;

使用上面的方式声明枚举并不会创建类数据成员,也就是说,所有对象中都不包含枚举。另外,Months只是一个符号名称,在作用域为整个类的代码中遇到它时,编译器将使用12来代替它。


(2),使用关键字static

class Person{private:    static const int Months = 12;    double cost[Months];    string name;    int age;

上面创建一个名为Months的常量,该常量将与其它静态变量存储在一起,而不是存储在对象中。
0 0
原创粉丝点击