c++初学之面向对象

来源:互联网 发布:知乎 陌生人 编辑:程序博客网 时间:2024/06/08 03:26

今天下午看了c++,做个笔记,到时好回来复习。

1.面向对象

没有看google源码之前,认为自己明白了面向对象。看了之后我才能明白:我只是学会了面向对象的语法,编写的程序还是面向过程。对于初学者,要想彻底理解面向对象,请多看大神写的代码。多向大神学习。

2.面向对象的特征

抽象,封装,继承,多态

对于认知型动物,在没有一定的实物之前,是不可能提炼出一个实物的抽象概念。包括数学公式的各种推理,都是建立在一定的基础定理上的。就算是神学,或者某些心理学的定理,也是建立在人类的认识之上的。因此,初学者就不要看见,面向对象,抽象,封装,继承,多态,这几个概念没有理解,就停在这里,然后慢慢去理解什么意思。初学者应该多写代码,多读别人的代码,这些知识自然会因为大脑的长时间思考,而提炼出正确的抽象,进而成为人们口中的概念。

多写,多读,多想。

3.对象的定义

关键字class,例子如下:

class Human{

public :

void eat();

void run();

private:

int height;

};

Human是类名。

大括号之间的代码是:类的定义

public是一个访问权限的关键字:表示可以被外部访问。

private也是一个访问权限的关键字:表示只能被该类访问,不能通过外部访问。

在上面的类中,只写了函数的声明,并没有对函数进行定义。定义如下:

void Human::eat(){

cout << "eat"<<endl;

}

void Human::run(){

cout << "run" << endl;

}

在对类中的方法进行定义的时候,语法如下:函数返回类型 类名::函数名(形参类型 形参){函数体}

举个例子如下:

#include<iostream>
using namespace std;
class Human{
public:
void eat();
void run();
private:
int height;
};


int main(){
Human zhangsan;
zhangsan.eat();
zhangsan.run();
return 0;
}
void Human::eat(){
cout << "eat" << endl;
}
void Human::run(){
cout << "run" << endl;
}

对于上面的成员变量height,因为是private中,所以不能直接访问。可以通过public 函数来对其进行读取。

改进Huamn的函数如下:

class Human{
public:
void eat();
void run();
void set(int);
int get();
private:
int height;
};

然后对set和ge函数进行定义。定义如下:

void Human::set(int x){
height = x;
cout << "height is " << height<< endl;
}
int Human::get(){
return height;
}

上面的类Human,将函数的声明和定义,进行了分开,其实是可以直接写在一起的。为什么要这么做呢?

可以将Human的声明放在头文件中,然后其他的就可以直接include进去,而不用关心这个头文件中的具体实现。

4.内联函数

每一个函数都是存放在内存的一块指令集,当要调用这个函数的时候,会跳到对应的位置然后执行指令,执行完成之后,再次跳回到程序开始之前的位置。因为cpu的预取系统并不能每次都命中指令,特别是在有跳转指令的情况下,命中的概率就更低了,因此,跳转指令对程序的性能影响很大,过多的程序跳转就不太可能接受。因此c++引入了内联函数的用法。

内敛函数的关键字是:inline。

用法如下:

inline int func();

这个告诉编译器,每次有地方调用这个函数func的时候,不是通过跳转指令,跳到对应位置执行,而是直接将这个函数的代码快,直接复制到调用的地方。这个虽然避免了程序的频繁跳转,但也加大了程序的大小。

5.const修饰成员函数

如果我们不想让某个成员函数修改成员变量的值,可以将这个函数用const来修饰,用法如下:

void func(int x,inty) const {i=x,j=y;}

这个函数使用了const关键字,表示这个函数不能修改类中的成员变量,因此,对于成员变量i,j的赋值将会被编译器识别到,并在编译时报错。

6.构造函数

为了在创建对象的时候,就初始化好相应的数据,因此,引入了构造器。

构造器没有返回值,构造器名和类名相同。如下:

class Human{

public :

Human(int x){

height = x;

}

private:

int height ;

}

用法如下:

#include<iostream>
using namespace std;
class Human{
public:
Human(int x){
height = x;
}
Human(){};
private:
int height ;
};


int main(){
Human zhangsan(3);
return 0;
}

当没有定义构造函数时,系统默认为有一个形参为空的构造函数,一旦自己定义了构造函数,那么系统就不会自动创建一个形参为空的构造函数。

7.析构函数

创建对象的时候回去调用构造函数,那么销毁对象的时候,回去调用类的析构函数。

用法如下:

class A{

 ~A(){};

}

析构函数也没有返回值类型,同时析构函数只能有一个,析构函数名与类名相同,为了区分构造函数,在析构函数前加一个~。

明天继续,加油。

0 0
原创粉丝点击