1. 写在前面:
从本节开始,学习C++编程的基本语法。C++语言,虽然兼容C语言语法,但是,它的优势最主要还是在面向对象的特性这部分
所以,我们之间从面向对象的编程知识开始。
本教程的编辑编译环境是:Dev-C++ 4.9.9.2 。
2. 实践内容:
类的定义: 定义一个类A,无实际意义,仅仅为了展示语法特性。
3. 思考:
定义一个类,有什么注意事项?
如何优雅的定义一个类?
4. 代码与代码说明:
(1)代码:
/* test source: */
#include "stdio.h"
class A
{
private:
//int i = 0; //error: ISO C++ forbids initialization of member `i'
int j; //OK
//A a; //error: field `a' has incomplete type
A *pa; //OK,思考:这种定义有什么用?在什么情况下会使用这种形式 ?
// 答:有两个功能:一, 代替this; 二, 实现链式存储结构.
//建议:如果仅仅为了代替this,那么,没有必要,直接用this更好,否则,还得维护这个指针变量,正如本例一样;
// 要用链式存储结构,那么,请采用链表(list)数据结构.
//总结:虽然可以正确使用,但不建议这样用.
public:
A()
{
pa=this;
}
~A()
{
if(pa!=NULL)
{
delete pa; pa=NULL;
}
}
int getJ()
{
return j;
}
void setJ(int j)
{
pa->j=j;
}
};
int main()
{
A a1;
a1.setJ(5);
printf("j = %d /n", a1.getJ()); // result: j = 5
while(1);
}
(2)代码说明:
错误1: ISO C++ forbids initialization of member `i'
解释:在 cpp文件中,数据成员定义的同时,不可以进行初始化,对于int型的值,默认为0。
最佳实践:如果要对数据成员进行初始化,请在构造函数中进行;或者,在头文件.h/.hpp文件中进行。
错误2:field `a' has incomplete type:
解释:不能在类中再声明一个该类的数据成员;但是可以声明该类的指针变量pa。因为在编译时,A类型还没有编译完成,计算机无法识别A类型(所以提示incomplete type错误),无法为a变量申请内存空间。但是,A *pa中,pa是指针类型,是一个地址,计算机可以为其分配内存空间。
最佳实践:A *pa虽然可以正确使用,但不建议这样用。因为pa的功能可以用this代替。
5. 要点总结:
类是一种用户自定义的数据类型。
(1)在类内不允许对所定义的数据成员进行初始化。
(2)类中的数据成员的类型可以是任意的,包括整型、浮点型、字符型、数组、指针和引用等。
也可以是对象。即另一个类的对象,可以作为该类的成员。但是,自身类的对象是不可以的(A a是非法的),而自身类的引用是可以的(A *pa是合法的)。
(3)在类的说明部分之后必须加分号“;”。
6. 原文引用:
(1)Those types are not "abstract";
they are as real asintandfloat.
这些类型并不"抽象";
它们像int和float一样实际。 [ chapter 10 Classes: P234]
(2)Ideally, such types should not differ from built-in types in the way they are used, only in the way they are created.
最理想的情况是,在使用方式上应该无法区分出这种类型与内部类型,
使它们的差异仅仅在创建的方式上。 [ 10.2 Classes: P235 ]
------- << The C++ Programming Language >> Third Edition, Bjarne Stroustrup
类,可以看作是一种数据类型,即类类型。