C++入门小知识点

1、基本面向对象

People *p=new People();
p->sayHello();

//C++没有垃圾回收机制,需要用delete关键字
delete p;

//new ----->delete

//C语言的
//malloc(size_t)
//free(void *)

2、继承

class Man :public People
{
public:
};  

3、构造和析构

析构的意思大概是在对象在被销毁之前,手动释放一些空间等

class People{
public:
    Object(){
        printf("Create object");
    }
    ~Object(){
        printf("Delete object");
    }
}

void creatObj(){
    {
        People p;
    }
    printf("run");
    //****************
    //以上的输出为 create ,,delete,, run
    //**********
    //以下的输出为 create ,, run ,, delete
    //*********************
    People p;
    printf("run");
}
View Code

4、执行父类的函数(多态)

Man::Man(int age):People(age,1){
} 
``` 

//接下来是执行一般函数
//在子类的实例中直接调用
```
Man* man = new Man(23);
man->sayHello();//这样只能调用子类的函数
//如果想直接调用父类的函数
man->People::sayHello();  

//有以下两种方式,通过子类调用父类的函数
Man::Man(int age):People(age,1){
    //People::sayHello();
 
}
 
void Man::sayHello(){
    //People::sayHello();
    printf("Man say:Hello C++\n");
};
View Code

5、实函数、虚函数

只要一个类中包含 纯虚函数,就可以把它认定为是一个抽象类
一个类中所有方法都是纯虚函数,可认定为一个纯需类-->java接口
 
java里单重继承和多重实现--->c++多重继承
 
实现的时候,最好主体类只是单重继承,而多重实现的时候,实现的父类最好是纯虚类(对应接口)
    People *p = new Man(23);
    p->sayHello();
//指向Man实例的p,执行了People类的方法
//与java不同
//这里会调用People的SayHello方法,而不是Man的SayHello方法

    virtual void sayHello();  
//要想实现在java语言里重写的话
//People 和Man类中SayHello方法全部需要添加virtual

virtual void eat()=0;  
//纯虚函数--->  对应 java抽象方法(本身不实现,由子类实现)
View Code

6、运算符重载

class Point
{
private:
    int x;
    int y;
public:
    Point(int x, int y){
        this->x = x;
        this->y = y;
    };
    int getX(){
        return this->x;
    }
    int getY(){
        return this->y;
    }
    void add(Point p){
        add(p.getX(), p.getY());
    }
    void add(int x, int y){
        this->x += x;
        this->y += y;
    }
    void operator+=(Point p){
        add(p);
    }
};

//int main()里面
    //Point p(10, 10);
    //p.add(Point(12, 12));
    //p += Point(13, 12);
//     std::cout << p.getX() << "\n";
    或者
     Point *p = new Point(6, 6);
    (*p) += Point(1, 1);
    std::cout << p->getX() << "\n";  

//终于搞明白了,当创建的是一个实体类的时候,Point p(10,10);这时候调用是 p.getX();
//而指针类的时候,p->getX();
View Code

7、伪函数

一个类或者结构体

通过运算符重载,重载了()
看起来好像是一个方法一样调用
 
可以将一个伪函数像一个变量一样进行传递
 
作为一个方法回调,传给另外的应用程序
将一个类当做一个函数对待
class Hello{
public:
    void operator()(){
        printf("Hello CPP\n");
    }
};  


int main()里面
    Hello h;
    h();  
View Code

8、指针

//比较麻烦的一种
class Object{
public:
    void(Object::*sayHi)();
};
class Hello :public Object{
public:
    Hello(){
        sayHi = (void(Object::*)())(&Hello::HelloSayHi);
        (this->*sayHi)();
    }
    void HelloSayHi(){
        printf("Hello CPP\n");
    }
}; 

int main()里面
Hello *h = new Hello();
    delete h;  

//上面的略做精简

class Object;
typedef void(Object::*SayHi)();
class Object{
public:
    //void(Object::*sayHi)();
    SayHi sayHi;
};
class Hello :public Object{
public:
    Hello(){
        //sayHi = (void(Object::*)())(&Hello::HelloSayHi);
        sayHi = (SayHi)(&Hello::HelloSayHi);
        (this->*sayHi)();
    }
    void HelloSayHi(){
        printf("Hello CPP\n");
    }
};  
View Code

9、引用

实际上就是传指针,减少内存拷贝

    void add(Point &p){
        this->x += p.x;
        this->y += p.y;
    }

    //相比
    void add(Point p){
        this->x += p.x;
        this->y += p.y;
    }  
View Code

10、友元类

将一个类里面的私有成员指定公开给另一个类

相当于Java的friendly
 
C++语言变量不加修饰符默认是私有的(private)
class A{
    friend class B;
    int num;
public:
    A(){
        num = 10;
    }
};
class B :public A{
public:
    B(){
        A a;
        printf("%d\n", a.num);
        //printf("%d\n", num);
    }
};

在int main里面
    B b;  
View Code

 

 

posted @ 2017-02-27 14:15  益达915  阅读(153)  评论(0编辑  收藏  举报