C++学习笔记(一)——类和对象

类和对象

我的博客:竹山听雨

类的定义

class 类名
{
	private://私有数据成员和成员函数
    public: //公有数据成员和成员函数
    protected: //受保护的数据成员和成员函数
}

注意: 定义类时,不允许初始化数据成员

类中成员函数的定义

外联函数

在类外定义成员函数时,必须在函数名前缀上加上类名,在之间加上::,若不加类名,则成为全局数据或全局函数

返回值类型 类名:: 成员函数名
{
    
}

void Student::set(int a,int b)
{
    ....
}

内联成员函数

程序编译时将内联成员函数的代码插入在函数的每个调用处,作为函数体的内部扩展

class Student{
    public:
    void set(int sid,string name)
    {
        ....
    }
}

或者再关键字前面添加inline,可以在类定义体外的函数声明为内联函数

inline void set()
{...}
或
void inline set()
{}

对象

在面向对象开发的软件系统中,对象是类的实例,是属性与服务的封装体。一个对象就是一个实际问题中的实体。

对象定义

方法一:

class Student
{
    public:
    void set();
    private:
    int id;
    ...
}student1

方法二:

class Student
{
    public:
    void set();
    private:
    int id;
    ...
}
Student student1;

成员的访问

定义了类及其对象,就可以定义成员函数实现对对象内部属性的访问。

公有(public),内部外部都可以进行范围

  • 通过对象调用成员

对象名.公有成员

  • 通过指向对象的指针调用成员

指向对象的指针->成员

  • (*对象指针名).公有成员

只有用public定义的共有成员才能使用远点运算符访问,对象中私有成员只有通过该类的公有成员函数来访问他们

名字解析与this指针

名字解析: 在调用成员函数时,通常使用缩写形式.因此可以定义两个或多个类的具有相同名字的成员而不会产生二义性

this指针: 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向接受该函数调用的对象,在程序中可以使用关键字this来引用该指针。

void Tdate::set(int m,int d,int y)
{
    month=m;
    day=d;
    year=y;
}
Tdate dd;
Dd.set(3,11,28);
//当调用成员函数set时,该成员函数的this指针指向类Tdate的对象dd。成员函数set中对month,day,year的引用表示引用对象dd的数据成员。C++语言编译器所认识的成员函数set的定义形式为
void Tdate::set(int m,int d,int y)
{
    this->month=m;
    this->day=d;
    this->year=y;
}

即对该成员函数中访问的类的任何数据成员,C++语言编译器都认为访问this指针所指向对象的成员。使用this指针,保证了每个对象可以拥有不同的数据成员值,但处理这些数据成员的代码被共享

带缺省参数的成员函数和函数重载成员函数

类的成员函数也可以带缺省值的函数,其调用规则同普通函数。成员函数也可以是重载函数,类的成员函数的重载与全局函数的重载方法相同

构造函数和析构函数

当建立一个对象时,对象的状态(数据成员的取值)是不确定的。构造函数是C++中一个特殊的成员函数,它可自动进行对象的初始化。而析构函数在对象撤销时执行清理任务,进行善后处理

特性

  • 没有返回值说明,也就是定义构造函数和析构函数不能指出函数返回值得类型,void也不能有

  • 它们不能被继承

  • 构造函数可以有缺省常熟

  • 析构函数可以是虚的,单构造函数不可以是虚的

  • 不可取他们的地址

  • 不能用常规调用方法调用析构函数,当使用完全的限定名(带对象名。类名和函数名)时,可以调用析构函数

  • 当定义对象时,编译程序自动调用构造函数,当删除对象时,编译程序自动地调用析构函数

对象成员

对象成员也称为类的聚集,是指在类的定义中,数据成员可以为其他类的对象,即类对象作为另一个类的数据成员

静态成员

静态成员的特征是不管这个类创建了多少个对象,而静态成员就只有一个副本,这个副本被这个类的所有对象共享

静态数据成员

class A{
    Static float x,y;
    Int a,b;
}

实际上可以将静态数据成员看成一个全局变量,将其封装在某个类中通常有两个目的

  • 限制该变量的作用范围,只能由该类对象的函数成员直接访问
  • 将意义相关的全局变量和相关的操作物理地放一起,便于可读

格式:

<数据类型><类名>::<静态数据成员名>=(初始值);

类外初始化

Int A:X=5;
Int A:Y=10;

静态成员函数

静态成员函数内无this指针,他是同类所有对象的共享资源,只有一个副本,因此不能直接访问非静态的数据成员必须通过某个该类对象才能访问。

而一般的成员函数都含有一个this指针,指向对象自身,可以直接访问非静态的数据成员

class x
{
    int member_int;
    staic int static_int;
    public:
    statc void func(int i);
    ...
}
void x::func(int i)
{
    member_int=i; //会报错
    static_int=j; //正确
    obj.member_int=i;//正确,指定了被引用的对象
    ...
}
  • 静态成员函数中访问的基本是静态数据成员或全局变量
  • 由于静态成员函数属于类独占的成员函数,因此访问静态成员函数的消息接受者不是类对象,而是类自身
  • 静态成员函数不能是虚函数

指向类成员的指针

C++提供一种特殊的指针类型,它指向类的成员,而不是指向该类的一个对象中该成员的一个实例

由类外指向类内的指针变量

类型付 类名:: *指针名=地址

class A{
public:
    int i,*p;
    a(){i=10;p=&i;}
}
int A::*p=&a::i;  //p是类外指针

类外指向成员函数的指针数据

类型名(类名:: *指针名)(参数类型表)=&类名::函数名

class A
{
    int i;
    public:
    int set(int k)
    {
        i=++k;
        return i;
    }
}
void main()
{
    int A(A::*f)(int)=&A::set;
    A aa;
    cout<<(aa *f)(10)<<endl;
}

指向类内静态成员的指针

  • C++语言不检查静态成员处于何处
  • 必须在全局区用"数据类型 类名::静态变量名[=…];"
class A{
    public:
    staic void set(...){...}
};
void(*f)(int)=&a::set;

猜你喜欢

转载自blog.csdn.net/InkBamboo920/article/details/106280120