C++ 命名空间、引用、指针、容器、强转、类、友元函数、友元类、单例、重载操作符、继承、多态、虚函数、模板(泛型)

命名空间
类似包名 区分重名

using namespace std;


//命名空间
namespace first_space {
    void fun() {
        cout << "first_space" << endl;
    }
}
namespace second_space {
    void fun() {
        cout << "second_space" << endl;
    }
}



int main(int argc, const char * argv[]) {
	//命名空间
    first_space::fun();
    second_space::fun();
	return 0;
}

//first_space
//second_space

引用 和 指针
在这里插入图片描述

引用直接用& 即可
int& r = xxxx;

//引用
    int iforYinYong = 10;
    double dforYinYong = 9.0;
    int* pYinYong = &iforYinYong;  //指针
    int& r = iforYinYong;	//引用
    cout << "Value of iForYinYong reference: " << r << endl;

容器

#include <vector>
#include <set>
#include <map>

int main(int argc, const char * argv[]) {
	//容器  stl: 标准模板库
    //序列式 关联式
    //序列式容器:元素排列顺序 与 元素本身 无关,由添加顺序决定。 stack
    //vector list dequeue queue stack priority queue
    vector<int> vec1;
    //声明 一个元素空间
    vector<int> vec2(1);
    //6个元素 值都是1
    vector<int> vec3(6, 1);
    
    vector<int> vec4(vec3);
    //添加元素
    vec1.push_back(10);
    //通过下标 获取元素
    cout << "通过下标获取元素:" << vec1[0] << endl;
    //获取对头 队尾的元素
    vec1.front();
    vec1.back();
    vec1.clear();//清空
    vec1.erase(vec1.begin(), vec1.end());//区间
    cout << "容器大小: " << vec1.capacity() << endl; //容器大小
    
    //关联式 set map hashmap
    //set 集合  元素不可重复
    set<int> set1 = {1, 2, 3, 4};
    set1.insert(1); //已存在 不会加进去
    pair<set<int>::iterator, bool> _pair = set1.insert(6); //返回值 添加了什么,是否成功
    std::cout << "set集合里元素个数有:" << set1.size() << endl;
    set<int>::iterator itt = set1.begin();
    set1.end();//最后一个元素的 下一个元素
    for (; itt != set1.end(); itt++) {
        cout << *itt << endl;
    }
    
    //map
    map<int, string> map1;
    map<int, string> map2 = {{1, "a"}, {2, "b"}};
    map2.insert({3, "c"});
    //修改
    map2[1] = "d"; //1是key
    map<int, string>::iterator ittm = map2.begin();
    for (; ittm != map2.end(); ittm++) {
        cout << ittm->first << ":" << ittm->second << endl;
    }
}

c的强转
在这里插入图片描述

C++ 分四种转换
在这里插入图片描述

在这里插入图片描述

class Parent {
public:
    void test() {
        cout << "p" << endl;
    }
};
class Child: public Parent {
public:
    void test() {
        cout << "c" << endl;
    }
};


//强转
    //const_cast  相互转化
    const char *a7; //相当于java的final
    char *b7 = const_cast<char*>(a7);
    char *a8;
    const char *b8 = const_cast<const char*>(a8);
    //static_cast  基本类型转换  父子转换   编译时
    Parent *parent = new Parent;
    Child *c = static_cast<Child*>(parent);
    c->test();
    //dynamic_cast  运行时


通过有缘函数或者有缘类 可以访问修改私有成员

头文件 Student.h

#ifndef Student_h
#define Student_h
class Student {
    //友元函数
    friend void test(Student*);
    //友元类
    friend class Teacher;
    int i;
    
public:
    Student(int i, int j);
    ~Student();//析构函数
    
    void setJ(int j);
    
    void setK(int j) const;
    
    int getB() {
        return b;
    }
    
    int getA() {
        return a;
    }
    
    private:
    int a;

    private:
    int b;

    protected:
    int c;

};
    class Teacher {
        public:
        void call(Student* s) {
            s->a = 1000;
        };
    };



#endif /* Studentr_h */


Student.cpp

#include "Student.hpp"
#include "Student.h"
#include <iostream>
using namespace std;

//相当于安卓里的 onCreate
Student::Student(int i, int j):i(i) {
    //:i(i) 省去写this 直接给成员变量赋值
//    this->i = i;
    cout << "构造方法" << endl;
}

//可以通过方法给成员变量赋值
void Student::setJ(int j) {
    this->a = j;
}
//常量函数
//表示不会 也不允许 修改类中的成员
void Student::setK(int j) const{
//    this->a = j;
}



//相当于安卓里的 onDestroy
Student::~Student() {
    cout << "析构方法" << endl;
}


main函数

#include <iostream>
#include "Student.h"

void test(Student* stu) {
    stu->b = 100;
}

int main(int argc, const char * argv[]) {
    //构造
    Student student(10, 20);
    test(&student);
    
    std::cout << student.getB() << std::endl;
    
    Teacher teacher;
    teacher.call(&student);
    
    std::cout << student.getA() << std::endl;
    return 0;
}

单例
Single.h

class Single{
private:
    static Single* instance;
    Single();
    

public:
    static Single* getInstance();
};


Single.cpp

#include "Single.hpp"
#include "Single.h"
Single* Single::instance = 0;

Single* Single::getInstance() {
    if (!instance) {
        instance = new Single();
    }
    return instance;
};


main

#include <iostream>
#include "Single.h"

int main(int argc, const char * argv[]) {
    Single* single = Single::getInstance();
    std::cout << single <<  std::endl;
    return 0;
};


操作符
Test.h

#ifndef Test_h
#define Test_h
class Test {
public:
    int i;
    Test operator + (const Test& t) {
        Test temp;
        temp.i = this->i + t.i;
        return temp;
    };
};

#endif /* Test_h */


main

#include <iostream>
#include "Test.h"
int main(int argc, const char * argv[]) {
    Test test1;
    test1.i = 100;
    Test test2;
    test2.i = 200;
    
    Test test3 = test1 + test2;
    std::cout << test3.i << std::endl;
    return 0;
}

继承
多态:父类引用指向子类对象
静态多态,调用的是父类方法。
动态多态,调用子类方法。
Extend.h

#ifndef Extend_h
#define Extend_h
#include <iostream>
using namespace std;
class Parent1 {
public:
    //动态多态
    virtual void eatting() {
        cout << "parent1" << endl;
    }
    
    //纯虚函数 类似抽象方法
    virtual void abstractMethod() = 0;
};

class Parent2 {
public:
    void eatting() {
        
    }
};

class Child : public Parent1, Parent2 {
public:
    void eatting() {
        //super.eatting()
        Parent1::eatting();
        cout << "child" << endl;
    }
    
    //子类实现 纯虚函数  也就是抽象方法
    void abstractMethod() override {
        cout << "子类重写了父类的 抽象方法" << endl;
    };
};


#endif /* Extend_h */

main

#include <iostream>
#include "Extend.h"
int main(int argc, const char * argv[]) {
    Child child;
    child.eatting();
    
    
    //静态多态
    Parent1* child2 = new Child();
    child2->eatting(); // 因为是静态 在编译时期,就认为是parent1的eatting方法,没等创建child呢。
    
    //动态多态 需要把 Parent1类的方法前 加关键字 virtual
    //将其声明为虚函数
    //注意事项:1、构造方法永远不要设置为虚函数  如果父类是 虚函数构造,子类就没办法创建了
    //       2、析构方法 声明为虚函数  好让真正的子类去释放内存
    
    return 0;
}

模板(泛型)

#include <iostream>
//泛型基础 模板编程
   //函数模板  java的泛型方法
   /**
        T method(T t) {}
    */
   template <typename T>
   T methodA(T t1, T t2) {
       return t1 > t2 ? t1: t2;
   }

//类模板  java的类泛型
    template <class T, class E>
class Q {
public:
    T test(T t, E e) {
        return t + e;
    }
};

int main(int argc, const char * argv[]) {
   //方法模板
    int result = methodA(1, 2);
    std::cout << result << std::endl;
    //类模板
    Q<int, float> q;
    std::cout << q.test(1, 2.0) << std::endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值