VS 学习笔记-C++相关


1.C++:封装性,继承性,多态性。

2.struct和class的区别:struct默认为public,class默认为private。

  include的区别:<>会直接到系统目录去查找文件,""会现在当前目录去查找。

3.构造函数:用来初始化类内部的数据成员。

(1)在创建一个对象之后,需要分配内存给对象本身,必须需要构造函数。若没有则编译器会提供一个默认的构造函数(没有参数)。

(2)若类里面自己定义了构造函数,则不论他带不带参数,编译器都不提供默认的构造函数了。


4.析构函数:当一个对象生命周期结束时,其所占有的内存空间就要被回收,这个工作由析构函数来完成。

(1)析构函数是反向的构造函数,不允许有返回值也不允许带参数,且一个类只能有一个析构函数。

(2)对象被系统回收或被程序用delete删除时,析构函数被调用。

(3)在构造函数中初始化对象的某些成员变量,给其分配内存空间(堆内存),在析构函数中释放对象运行期间所申请的资源。


5.函数的重载:

(1)条件:函数参数不同,或参数个数不同才能构成函数重载。

 只有返回值不同是不行的。

   void output();

   int output();

 有缺省值的定义会发生歧义。

   void output(int a,int b=5);

   void output(int a);


6.this 指针:每当产生了一个对象,对该对象产生一个隐含的指针,指向该对象本身。

(1)每当调用一个对象的成员时,例如pt.output(10,10),其实成员函数除了接受两个实参,还接受到了一个对象s的地址。这个地址呗一个隐含的形参this指针所获取。等同于this=&pt.

#include <iostream>
using namespace std;
class Point{
  public:
  int x;
  int y;
  Point(){  
	x=0;y=0;
  }
  Point(int a,int b){
    x=a;
    y=b;
  }
  ~Point(){}
  void output(){
	  cout<<x<<endl<<y<<endl;
  }
  void output(int x, int y){
	  this->x=x;
	  this->y=y;
  }
};

void main(){
	Point pt(3,3);
	pt.output(5,5);
	//pt.x=5;
	//pt.y=5;
	//cout<<pt.x<<endl<<pt.y<<endl;
	pt.output();
	
	system("pause");
}

7.类的继承

(1)继承方式:

PUBLIC 基类public-protected-private, 子类public-protected-no access

PROTECTED 基类public-protected-private, 子类protected-protected-no access

PRIVATE 基类public-protected-private, 子类private-private-no access     

(2)构造函数的继承:

创建子类对象时,首先调用的是基类的构造函数。这时,如果Animal构造函数带参数,那么需要Fish构造函数传递该参数。若Fish含有自有的const参数也需要在这时初始化。

(3)函数的覆盖:只发生在父类和子类之间。相同的函数名子类的覆盖父类的。若要用父类的需要指定名字的作用域。

class Animal{
public:
	Animal(int height){
		cout<<"Animal construct"<<endl;
	}
	~Animal(){
		cout<<"Animal deconstruct"<<endl;
	}
	void eat(){
	  cout<<"animal eat"<<endl;
	}
protected:
	void sleep(){
	  cout<<"animal sleep"<<endl;
	}
	void breathe(){
	  cout<<"animal breathe"<<endl;
	}
};

class Fish : public Animal{
public:
  Fish():Animal(400),a(1){
    cout<<"Fish construct"<<endl;
  }
  ~Fish(){
    cout<<"Fish construct"<<endl;
  }
  void test(){
	  sleep();
	  //breathe(); private 在子类中都不能访问
  }
  void breathe(){
    Animal::breathe();
    cout<<"fish bubble"<<endl;
  }
private:
	const int a;
};

(4)多态性(虚函数):

  若C++在编译时发现Animal类的breathe()函数时虚函数,C++就采用迟绑定,在运行时依据类型的来确认调用的是哪一个函数。

  如果不是虚函数。则在main中即使是Fish对象的指针调用breathe,仍会调用Animal的breathe().

  如果是虚函数,则调用时先在子类中找对应的函数名,没有才会调用基类。

virtual void breathe(){
	  cout<<"animal breathe"<<endl;
	}

(5)纯虚函数:在Animal中可以定义纯虚函数,由子类去决定他的操作,基类只给出名字。但是这时,基类不能够实例化对象。而且如果子类没有定义这个函数,则该子类也不能实例化对象。

virtual void breathe()=0;

8.VS程序编译连接过程:

首先所有cpp都分别预处理(处理#),在内存中生成翻译文件。然后COMPILE编译会分别把翻译文件转化成包含机器指令的OBJ目标文件。

最后LINK把所有OBJ连接起来。

#ifndef ANIMAL_H_H
#define ANIMAL_H_H

class Animal{
public:
	Animal();
	void eat();
protected:
	void sleep();
	virtual void breathe();
};

#endif

头文件中的预编译#ifndef是为了防止头文件重复包含的问题



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值