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

本文主要是介绍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 queuevector<int> vec1;//声明 一个元素空间vector<int> vec2(1);//6个元素 值都是1vector<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;}//mapmap<int, string> map1;map<int, string> map2 = {{1, "a"}, {2, "b"}};map2.insert({3, "c"});//修改map2[1] = "d"; //1是keymap<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的finalchar *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;
}

这篇关于C++ 命名空间、引用、指针、容器、强转、类、友元函数、友元类、单例、重载操作符、继承、多态、虚函数、模板(泛型)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/921171

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n