C++
文章平均质量分 53
基础学习
瓴翎玲
一点一滴积累,一步一步向前
展开
-
C++的多态
多态——函数调用的多种形态静态的多态——函数重载静态:指编译时//静态的多态int main(){ int i; char ch; cin >> i; cin >> ch; cout << i << endl; //调用的是operatoe>>(int i) cout << ch << endl;//调用的是operaatoe>>(char ch) return 0;}动态的多态原创 2022-05-25 16:01:34 · 75 阅读 · 0 评论 -
C++的继承
一、继承1.定义继承机制时面向程序设计使代码可以复用的最重要是手段,它允许程序员在保持原有类特性的基础上进行扩展,这样产生的类就称子类或者派生类。继承基类成员访问方式的变化类成员/继承方式public继承protected继承private继承基类的public成员派生类的public成员派生类的protected成员派生类的private成员基类的protected成员派生类的protected成员派生类的protected成员派生类的private成员原创 2022-05-25 16:01:21 · 49 阅读 · 0 评论 -
模板的进阶
一、非类型模板参数类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。//非类型模板参数---整型常量(只能)template<class T = int,size_t N=8>class Array{public: void f() { N = 1000; }private: T _a[N];};int main(){ A原创 2022-03-03 21:53:46 · 159 阅读 · 0 评论 -
list使用
1.遍历 list<int> lt; 10 lt.push_back(1); 11 12 lt.push_back(2); 13 lt.push_back(3); 14 lt.push_back(4); 15 16 //遍历方式1 17 list<int>::iterator it = lt.begi原创 2021-11-25 17:27:20 · 236 阅读 · 0 评论 -
vector
1.vector的插入vector<int> v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); v1[0] = 10; //可修改值2.vector的三种遍历void test_vector1(){ //遍历 //下标 for(int i = 0; i < v1.size(); i++) { cout << v1[i]原创 2021-11-21 16:34:45 · 92 阅读 · 0 评论 -
倒置字符串
题目描述将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I输入描述:每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100输出描述:依次输出倒置之后的字符串,以空格分割示例1输入:I like beijing.输出:beijing. like I解题思路:...原创 2021-10-14 20:19:37 · 185 阅读 · 0 评论 -
排序子序列
链接:https://www.nowcoder.com/questionTerminal/2d3f6ddd82da445d804c95db22dcc471?orderByHotValue=1&page=1&onlyReference=false来源:牛客网题目表述:牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.如原创 2021-10-14 18:12:25 · 86 阅读 · 0 评论 -
组队竞赛
链接:https://www.nowcoder.com/questionTerminal/6736cc3ffd1444a4a0057dee89be789b?orderByHotValue=1&page=1&onlyReference=false来源:牛客网题目描述牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。例如:一个队伍三个队员的水平值分原创 2021-10-13 21:44:39 · 77 阅读 · 0 评论 -
深拷贝的两种写法
传统写法namespace sxl{ //管理字符串的顺序表,可以增删查改 //字符串结尾有\0 class string { public: 构造函数 string(const char* str = "") :_str(new char[strlen(str) + 1]) { strcpy(_str, str); } 拷贝构造函数 //传统写法 //s2(s1) string(const string& s)原创 2021-09-13 18:44:06 · 343 阅读 · 0 评论 -
完整的string(模拟string接口的增删查改)
1.深拷贝与swap函数的综合函数声明: string(const char* str = ""); string(const string& s); string& operator=(const string &s); ~string(); void swap(string& s); //构造函数 //若str=nullptr,strlen会崩,会认为传的指针是空指针,会对空指针进行解引用原创 2021-09-06 15:00:04 · 123 阅读 · 0 评论 -
string接口
一、构造string1.基本构造2.三种遍历(1)for遍历:下标+[ ](2)迭代器遍历[begin(),end()):end()返回的不是最后一个数据位置的迭代器,返回的是最后一个位置下一个位置也要注意:C++中凡是给迭代器一般都是[)左闭右开的区间,迭代器是类似指针的东西(3)范围for,C++11的标准依次取容器中的数据,赋值给e(随意取的一个字母),自动判断结束、for (auto& e : s3) 若要修改,auto必须加&,告诉其是别名,只是拷贝二原创 2021-08-31 09:44:06 · 308 阅读 · 0 评论 -
类与对象(3)—— static成员
静态成员要点:(1)静态成员为所有类对象共有,不属于某个具体的对象,并且使放于静态区(2)静态成员变量必须在类外定义,定义时不添加static关键字(3)类静态成员即可用类名::静态成员或者对象.静态成员来访问(4)静态成员函数没有隐藏的this指针,不能访问任何非静态成员(5)静态成员和类的普通成员一样,也有public ,protected,private3种访问权限,也可以有返回值//静态成员//计算一个程序中A定义多少个对象出来class A{public: A() {原创 2021-07-26 18:45:23 · 101 阅读 · 0 评论 -
类与对象(3)—— explicit关键字和匿名对象
explicit关键字explicit主要可以使单参数的构造函数中,不会发生隐式的类型转换要点:(1)单参数的构造函数,支持隐式类型转换A aa2 = 2; //A tmp(2) + A aa2(tmp) 中间产生了一个临时对象tmp,再拷贝构造对象,现在的编译器,做了优化,直接调用构造函数A aa2(2)(2)string支持单参数的隐式类型转换,可以简便写法class A{public: explicit A(int a) //加了explicit就不会隐式类型转换原创 2021-07-26 18:07:32 · 186 阅读 · 0 评论 -
类与对象(3)—— 友元函数和友元类
友元,是一种突破封装的方式,尽量少用友元函数需要友元解决的问题: 运用operator<<进行函数重载,需要输出,若把operator<<定义为成员变量函数,因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作数了。但是实际使用中cout需要是第一个形参对象,才能正常使用。所以我们要将operator<<重载成全局函数。但是这样的话,又会导致类外没办法访问成员,那么这里就需要友元来解决。把operator<原创 2021-07-26 15:54:49 · 700 阅读 · 0 评论 -
const修饰成员函数
const Date* p1:const修饰* p1Date const* p2:const修饰* p2Date* const p3:const修饰p3结论:const在*之前修饰的是指针指向的对象,const在 *之后修饰的是指针本身bool operator==(const Date* this,const Date& d)const修饰的是this指向的对象,所以const在*之前bool operator==(const Date& d) const //bool o原创 2021-07-25 09:59:06 · 67 阅读 · 0 评论 -
C++详解实现日期类的运算(默认成员函数的综合运用)
1.头文件要点:(1)声明成员函数与成员变量(2)针对Date类,构造函数需要自己写,系统不会进行处理,析构函数、拷贝构造函数与赋值重载可以不用写(3)构造函数的声明与函数,缺省值只能写一处,下面代码中,构造函数的缺省值已经存在,则在函数中不能再存在(4)前置++与后置++的声明不一样,后置++会多一个int形参,这个形参没有作用,只是为了区分(5)运算符重载的&:参考拷贝构造函数中的讲解要点#include<iostream>using namespace std;原创 2021-07-22 20:59:36 · 600 阅读 · 1 评论 -
内存分布及管理
1.内存分布2.C与C++内存管理的区别(1)C++中如果是申请内置类型对象或者数组,malloc和new没什么区别,new和malloc都可用于申请动态内存,new是一个操作符,malloc是一个函数(2)如果时自定义类型,区别很大,new和delete是开空间+初始化 析构清理+释放空间,malloc和free仅仅是开空间+释放空间(3)建议在C++中,无论是内置类型还是自定义类型的申请释放,尽量使用new和delete(4)C++中,有多少个值就会调用多少次构造函数与析构函数(5)ne原创 2021-07-15 20:35:57 · 458 阅读 · 1 评论 -
类与对象(3)—— 初始化列表
1.初始化列表初始化列表的构成:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式必须在初始化列表中进行初始化的三类:(1)引用成员变量(2)const成员变量(3)自定义成员变量class A{public: A(int x) { cout << "A:_x" << endl; _x = x; }private: int _x;};class Date{public: //可以理解成,原创 2021-07-14 21:52:59 · 306 阅读 · 1 评论 -
类与对象(2)——赋值运算符重载
1.作用:让自定义类型可以像内置类型一样使用运算符,需要哪个运算符,就重载哪个运算符2.运算符重载与函数重载的区别:都用重载,但没有关联;区别:(1)函数重载支持定义同名函数(2)运算符重载是为了让自定义类型可以像内置类型一样去使用运算符。...原创 2021-07-13 20:48:31 · 435 阅读 · 0 评论 -
类与对象(2)—— 拷贝构造函数
拷贝构造函数也是特殊的成员函数,其特征如下:(1)拷贝构造函数是构造函数的一个重载形式。(2)拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。(3)若未显示定义,系统生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝我们叫做浅拷贝,或者值拷贝。注意:编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,我们还需要自己实现吗?当然像日期类这样的类是没必要的,但是像Stack、String这样的类若只进行浅拷贝,程序会崩溃,需要进行深拷原创 2021-07-06 21:12:16 · 237 阅读 · 0 评论 -
类与对象(2)—— 析构函数
析构函数1.定义析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。2.特性(1)析构函数名是在类名前加上字符 ~。(2)无参数无返回值。(3)一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。(4)对象生命周期结束时,C++编译系统系统自动调用析构函数。(5)编译器生成的默认析构函数,对会自定类型成员调用它的析构函数(即自定义类型成员调用自己域内的析构函数)。clas原创 2021-06-09 20:19:42 · 273 阅读 · 0 评论 -
类与对象(2)—— 构造函数
默认成员函数1.构造函数定义:构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。特性:(1) 函数名与类名相同。(2)无返回值。(3)对象实例化时编译器自动调用对应的构造函数。(4)构造函数可以重载。(5)如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。(6)无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函原创 2021-06-09 20:04:05 · 212 阅读 · 0 评论 -
数据结构的栈和堆与内存分段区域的栈和堆的区别和联系
区别:没有绝对的联系,他们属于两个学科的各自命名,内存分段区域中的是操作系统的专有名词联系:数据结构的栈与系统分段栈(函数栈帧)中的对象都符合先进后出原创 2021-06-09 19:22:50 · 88 阅读 · 0 评论 -
C++中使用nullptr
nullptr是C++11引入的,与C语言中的区别看下面例子:void f(int){ cout << "f(int)" << endl;}void f(int*){ cout << "f(int*)" << endl;}int main(){ int* p1 = NULL; int* p2 = nullptr; f(0); f(NULL); f(nullptr); //会自动匹配int*函数 return 0;} 运原创 2021-06-07 16:18:09 · 537 阅读 · 0 评论 -
类与对象(1)
1.C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。但是C++中一般定义类使用class2.类包含两部分:成员变量、成员函数(可以在类中定义成员函数)//类 -定义出一个新的类型//类由两部分构成:成员变量(属性)、成员函数(做的行为)//C++中的struct兼容C的所有用法,同时把struct升级成类//xx.h//在类设计中,一般想给别人(成员函数)访问的定义为共有(public)//不想给别人访问的就定义为private/protectedcl原创 2021-06-07 15:13:09 · 82 阅读 · 1 评论 -
C++基础(命名空间、输入输出、缺省参数、函数重载、引用、auto)
一、命名空间namespace标准库使用的三种方式:1.指定命名空间(最规范)使用时都要加std::2.把std整个展开相当于库里面的东西都到全局域(不推荐,日常练习写法)展开:using namespace std;缺点:若自己定义的东西与库冲突就没办法解决3.对部分常用的库里面的东西展开(常用方式,1与2的折中方式)using std::cout;using std::endl;二、输入输出ostream 类型全局对象 coutistream 类型全局对象 cinen原创 2021-06-05 20:50:54 · 117 阅读 · 0 评论 -
字符串排序
输入多组字符串,每组最多输入20个字符,按照字符的ASCII码升序排列输出。#include <algorithm>#include <string.h>#include <stdio.h>using namespace std; int main(){ char arr[20]; while(scanf("%s", arr) != EOF){ sort(arr, arr + strlen(arr)); pri原创 2021-06-03 10:57:47 · 85 阅读 · 0 评论