![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++开发
C++学习开发
祝你幸福365
好好学习,天天向上
展开
-
C++中的类型转换
1. const_cast//const_cast.cpp#include<iostream>#include<string>using namespace std;int main(int argc, char const *argv[]){ string man= "man"; cout<<man<<endl; const string woman = "woman"; //不能修改woman字符串中的内容 .原创 2021-08-03 20:49:45 · 117 阅读 · 0 评论 -
070-C++中const_cast,reinterpret_cast,static_cast,dynamic_cast
#include "stdafx.h"using namespace std;/**C语言类型转换隐式类型转换: double f = 1.0/2;显示类型转换: 类型说明符(表达式) 比如: double f = double(1)/double(2);C 语言类型转换的问题: 1. 任意类型之间都可以转换,编译器无法判断其正确性; 2. 难于定位:在源码中无法快速定位 C++的类型转换 const_cast 用于转换指针或引用,去掉类型的const属性 rei.原创 2021-04-03 11:20:37 · 72 阅读 · 0 评论 -
069-C++中void,NULL,nullptr
#include "stdafx.h"using namespace std;//NULL void nullptr/* 在C语言中: #define NULL((void*)0) 在C++11中,nullptr用来替代(void*)0 NULL则只表示0; nullptr 标准空指针 */void func(void* i){ cout<<"func(void*)"<<endl;}void func(int i){ cout<&l.原创 2021-04-03 11:20:24 · 130 阅读 · 0 评论 -
068-C++设计模式-观察者模式
// Observer.hpp#include <stdio.h>class Observer{public: Observer(){;} virtual ~Observer(){;} // 纯虚函数 // 当被观察对象发生变化h时,通知被观察者调用这个方法 virtual void update(void* p) = 0; };#endif /* Observer_hpp */// Observer.cpp#i.原创 2021-04-03 11:20:09 · 69 阅读 · 0 评论 -
067-C++中vector,list,deque,queue,stack,proiority_queue,map的使用
/* 泛型编程的思想 如果说面向对象是一种通过间接层来调用函数 泛型编程可以将算法与特定类型,进行剥离 *//* STL算法是泛型的 不 容器: 1. 序列式容器(Sequence Containers) 其中的元素都是可排序的(ordered) STL提供了 vector, list, deque 等序列式容器, 而stack, queue, priority_queue则是容器适配器 2. 关联式容器(Associate Containers) map multimap..原创 2021-04-03 11:19:53 · 244 阅读 · 0 评论 -
066-C++标准库介绍
#include<iostream>using namespace std;/** * C++ 标准库可以分为两部分: * 1. 标准函数库:这个库是由通用的、独立的、不属于任何类的函数组成的。函数库继承自C语言 * 2. 面向对象类库:这个库是类及相关函数的集合。 * C++标准库包含了所有的C标准库,为了支持类型安全,做了一定的添加和修改。 * * 标准函数库 * 标准函数库分为以下几类: * 1. 输入/输出 I/O * 2. 字符串和字符处理 * 3. .原创 2021-04-03 11:19:37 · 110 阅读 · 2 评论 -
066-C++中vector的insert、push_back、pop_back、erase
#include <iostream>#include <vector>using namespace std;int main(int argc, char const *argv[]){ vector<int> vec = {0,5}; // insert(position, value) // vec.end vec.insert(vec.end(), 1); vec.insert(vec.begin(), 10); vec.i.原创 2021-04-02 10:36:10 · 367 阅读 · 0 评论 -
065-C++中vector初始认识
#include <iostream>#include <vector>using namespace std;/** * 我们已经学习了C++模板的概念。C++ STL( 标准模板库)是一套功能强大的C++模板类, * 提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构, * 如向量、链表、队列、栈。 * * C++标准模板库的核心包括以下三个组件: * 组件 | 描述 * 容器(Cont.原创 2021-04-03 11:19:01 · 86 阅读 · 0 评论 -
064-C++进程fork
#include <stdio.h>#include <unistd.h>int main(){ pid_t pid; printf("pid=%d, Take camera, by subway, take air!\n", getpid()); pid = fork(); if (pid > 0){ printf("pid=%d, 我是精灵!\n", getpid()); pid = fork(); printf.原创 2021-04-09 11:06:43 · 121 阅读 · 0 评论 -
063-C++中多线程的连接和分离
#include <iostream>#include <cstdlib>#include <pthread.h>#include <unistd.h>using namespace std;#define NUM_THREADS 5void *wait(void *t){ int i; long tid; tid = *((int*)t); sleep(1); cout<<"Thread with.原创 2021-04-03 11:18:48 · 155 阅读 · 0 评论 -
062-C++中多线程传递多个参数
#include <iostream>#include <pthread.h>#include <cstdlib>#include <unistd.h>using namespace std;#define NUM_THREADS 5struct thread_data { int thread_id; char *message;};void *PrintHello(void *threadarg){ struct .原创 2021-04-03 11:18:35 · 708 阅读 · 0 评论 -
061-C++中多线程传递单个参数
#include <iostream>#include <pthread.h>#include <unistd.h>using namespace std;#define NUM_THREADS 5void *PrintHello(void *threadid){ // 对传入的参数进行强制类型转换,由无类型指针转换成整数型指针,然后再读取值 int tid = *((int*)threadid); cout<< "Hello.原创 2021-04-03 11:18:19 · 79 阅读 · 0 评论 -
060-C++中多线程初始认识
#include <iostream>// 必须使用的头文件#include <pthread.h>#include <unistd.h>using namespace std;#define NUM_THREADS 5// 线程的运行函数void* say_hello(void* args){ cout<<"Hello World\n"<<endl; return 0;}int main(int argc, ch.原创 2021-04-01 08:35:24 · 66 阅读 · 0 评论 -
059-C++中信号处理raise函数
#include <iostream>#include <csignal>#include <unistd.h>using namespace std;// raise() 函数// raise() 生成信号 该函数带有一个整数信息编号作为参数 语法如下// int raise(signal sig);void signalHandler(int signum){ cout<<"Interrupted signal "<<.原创 2021-04-03 11:17:53 · 537 阅读 · 0 评论 -
058-C++中信号处理
#include <iostream>#include <csignal>#include <unistd.h>using namespace std;// 信号处理函数,在键盘上执行 Ctrl+C 之后,就会发射一个终止程序的信号,// 这样信号处理函数就会接收到这个信号 进而进行相应的逻辑处理void signalHandler(int signum){ cout <<"Interrupt signal "<<sign.原创 2021-04-09 11:06:27 · 94 阅读 · 0 评论 -
057-C++中预定义宏
#include <iostream>using namespace std;int main(int argc, char const *argv[]){ /* code */ // 该行在当前文件中的第多少行 cout<< "value of __LINE__: "<<__LINE__<<endl; // 当前文件的文件名称 cout<< "valut of __FILE__: "<<__FILE__.原创 2021-03-31 09:56:17 · 68 阅读 · 0 评论 -
056-C++中#和##运算符
#include <iostream>using namespace std;// # 构串操作符// 构串操作符#只能修饰带参数的 宏的形参,它将实参的字符序列(而不是实参代代表的值)转换成字符串常量#define MKSTR( x ) #x#x#x#define TEXT( x ) "class"#x"Info"// ## 合并操作符// 合并操作符##将出现在其左右的字符序列合并成一个新的标记符// 注意:使用合并操作符##时,自身的标记符必须预先有定义,否则编译器会.原创 2021-03-30 08:19:35 · 176 阅读 · 0 评论 -
055-C++中条件编译
#include <iostream>using namespace std;#define DEBUG#define MIN(a, b) (a<b? a : b)int main(int argc, char const *argv[]){ /* code */ int i, j; i = 100; j = 30; // 如果前面已经定义过预编译常量 DEBUG 则可以对程序中打印语句进行执行 #ifdef DEBUG cerr<.原创 2021-04-02 10:37:09 · 108 阅读 · 0 评论 -
054-C++中#define预处理和参数宏
#include <iostream>using namespace std;#define PI 3.14159// #define 预处理指令用于创建符号常量。该符号常量通常称为宏,指令的一般形式为:// #define macro-name replacement-text// 当这一行代码出现在一个文件中时,在该文件中后续出现的所有宏都将会在程序编译之前被替换为 replacement-text// gcc -E 01-#define预处理.cpp > test.原创 2021-04-02 10:36:54 · 160 阅读 · 0 评论 -
053-C++中类模板
#include <iostream>#include <vector>#include <cstdlib>#include <string>#include <stdexcept>using namespace std;/** * 类模板 泛型类声明的一般形式如下所示: * template <class type> * class class-name { * * } * 在这里,type是占位符类.原创 2021-04-02 10:36:39 · 58 阅读 · 0 评论 -
052-C++中函数模板
#include <iostream>#include <string>using namespace std;/** * 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式进行代码编写。*/// T const& a 指明传入的类型为T类型的参数 a 是限定为常量,不可修改template <typename T> inline T const& Max(T const& a, T const& b){ .原创 2021-04-02 10:36:24 · 83 阅读 · 0 评论 -
051-C++中不连续的名字空间
#include <iostream>using namespace std;/** * using 指令引入的名称遵循正常的范围规则。名称从使用using 指令开始可见的,直到该范围结束。 * 此时,在范围以外定义的的同名实体是隐藏的。 * * 不连续的命名空间 * 命名空间可以定义在几个不同的部分中,因此命名空间是由几个单独定义的部分组成的。一个命名空间的各个组成部分可以分散在多个文件中。 * 所以,如果命名空间中的某个组成部分需要请求定义在另一个文件中的名称,则仍然需.原创 2021-04-02 10:35:56 · 489 阅读 · 0 评论 -
050-C++中名字空间using使用
#include <iostream>using std::cout;using std::endl;/**您可以使用 using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称这个相当于告诉编译器,后面就可以不用带命名空间的名称就使用命名空间中的名称。 using 指令也可以用来指定命名空间中的特定项目。例如,如果您只打算使用 std 命名空间中的 cout 部分,您可以使用如下的语句:using std::cout;随后的代码中,在使用 c.原创 2021-04-02 10:35:27 · 184 阅读 · 0 评论 -
049-C++中名字空间
#include <iostream>using namespace std;/**假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。同样的情况也出现在 C++ 应用程序中。例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就无法判断您所使用的是哪一个 xyz() 函数。因此,引入了命名空间这个概念,专.原创 2021-04-02 10:35:13 · 56 阅读 · 0 评论 -
048-C++中delete[]
#include <iostream>using namespace std;/** * 假设我们要为一个字符数组(一个有 20 个字符的字符串)分配内存, * 我们可以使用上面实例中的语法来为数组动态地分配内存,如下所示: * char* pvalue = NULL; // 初始化为 null 的指针 * pvalue = new char[20]; // 为变量请求内存 * 要删除我们刚才创建的数组,语句如下: * delete [] pvalue; .原创 2021-04-02 10:34:57 · 307 阅读 · 0 评论 -
047-C++中new和delete运算符
#include <iostream>using namespace std;/** * * 了解动态内存在 C++ 中是如何工作的是成为一名合格的 C++ 程序员必不可少的。 * C++ 程序中的内存分为两个部分: * 栈:在函数内部声明的所有变量都将占用栈内存。 * 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。 * 很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。 * 在 C++ 中,您可以使用特.原创 2021-04-09 11:07:01 · 127 阅读 · 0 评论 -
046-C++异常自定义Exception
#include <iostream>#include <exception>using namespace std;// 可以通过继承和重载 exception 类来定义新的异常。下面的实例演示了如何使用 std::exceptinon类 来实现自己的异常struct MyException:public exception{ /* data */ // const throw 是什么意思?? const char* what() const throw(.原创 2021-04-01 08:35:50 · 792 阅读 · 0 评论 -
045-C++异常处理
#include <iostream>using namespace std;double division(int a, int b) { if (b == 0 ){ throw "Division by zero condition!"; } return (a/b);}// 因为throw 抛出的异常是字符串 所以在catch块里的时候用的是 char* // 最后抛出的异常是 Division by zero condition!int.原创 2021-04-01 08:35:37 · 69 阅读 · 0 评论 -
043-C++文件位置指针
# include <iostream>using namespace std;/** istream 和 ostream 都提供了用于重新定位文件位置指针的成员函数。 这些成员函数包括关于 istream 的 seekg("seek get")和关于 ostream 的 seekp("seek put")。 seekg 和 seekp 的参数通常是一个长整型。第二个参数可以用于指定查找方向。查找方向可以是 ios::beg(默认的,从流的开头开始定位), 也可以是 i.原创 2021-04-01 08:35:06 · 1193 阅读 · 0 评论 -
042-C++读取和写入文件
#include <fstream>#include <iostream>using namespace std;/** * 上面的实例中使用了 cin 对象的附加函数,比如 getline()函数从外部读取一行, * ignore() 函数会忽略掉之前读语句留下的多余字符。 * */int main(int argc, char const *argv[]){ /* code */ char data[100]; // 以写模式打开文件 of.原创 2021-04-01 08:34:52 · 278 阅读 · 0 评论 -
041-C++中Singleton单例的实现
// Singleton.h#ifndef _SINGLETON_H#define _SINGLETON_H#include<iostream>using namespace std;class Singleton { // 将构造函数和析构函数私有化, 防止外部访问 private: Singleton(); ~Singleton(); // 全局区域 // 使用静态变量帮助解决资源的分配和释放 static Singleto.原创 2021-04-01 08:34:35 · 134 阅读 · 0 评论 -
040-C++数据封装
# include<iostream>using namespace std;class Adder{ private: int total; public: // 构造函数 Adder(int i = 0){ total = i; } // 对外接口 void add(int i){ total = total +i; } // 对外.原创 2021-04-01 08:34:16 · 61 阅读 · 0 评论 -
039-C++多态
#include <iostream>using namespace std;/** * C++中的动态是通过virtual关键字来实现的 如果不使用virtual 即使派生类重写父类方法,最后在运行时还是会执行 * 父类的方法,这种情况属于静态绑定。如果使用了virtual 则在运行时会调用派生类重写的父类方法,这种情况叫做动态 * 绑定。 * 使用virtual 关键字,但是有实现的方法称为虚函数 * 使用virtual 关键字,但是没有实现 并且格式是 virtual .原创 2021-04-01 08:33:46 · 74 阅读 · 0 评论 -
038-C++运算符重载
#include <iostream>using namespace std;class Box { private: int breadth, length, height; public: void setBreadth(int breth){ breadth = breth; } void setLength(int len){ length = .原创 2021-04-01 08:33:33 · 60 阅读 · 0 评论 -
037-C++函数重载
#include <iostream>using namespace std;/**C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。 * */clas.原创 2021-04-01 08:33:13 · 67 阅读 · 0 评论 -
036-C++多继承
#include <iostream>using namespace std;/** * 多继承即一个子类可以有多个父类,它继承了多个父类的特性。 * C++类可以从多个类继承成员,语法如下: * * class <派生类名>:<继承方式><基类名1>,<继承方式><基类名2>,...{ * 派生类类体 * } * 其中,访问修饰符继承方式是public, protected, private.原创 2021-03-31 09:55:45 · 57 阅读 · 0 评论 -
035-C++基类与派生类
#include <iostream>using namespace std;/**面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行时间的效果。当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。.原创 2021-03-31 09:56:33 · 239 阅读 · 0 评论 -
034-C++面向对象
#include<iostream>using namespace std;class Box { public: double length; double width; double height;};// 1. 类的定义必须在main方法之前,否则报找不到类的错误// 2. 类变量的定义不用new 和Java不一样 只是声明一下int main(int argc, char const *argv[]){ .原创 2021-03-31 09:55:29 · 51 阅读 · 0 评论 -
033-C++中条件分支语句
#include<iostream>using namespace std;typedef enum __COLOR{ RED, GREEN, BLUE} color;int main(int argc, char const *argv[]){ color color0; color0 = BLUE; if (color0 == RED){ cout<<"red"<<color0<<endl; }e.原创 2021-03-31 09:55:13 · 89 阅读 · 0 评论 -
032-C++中typedef的使用
#include <iostream>#include <cstring>using namespace std;/**下面是一种更简单的定义结构的方式,您可以为创建的类型取一个"别名"。例如:typedef struct Books{ char title[50]; char author[50]; char subject[100]; int book_id;} Books;现在,您可以直接使用 Books 来定义 Book.原创 2021-03-31 09:54:54 · 168 阅读 · 0 评论