参考柳婼的《从放弃C语言到使用C++刷算法的简明教程v4.7》,黑马,C语言中文网教程,及一些经验😎
从其他语言(C,Java)快速入门c++刷题
不同知识点
#include
using namespace std;
1.常量
2.数据类型
类型 | 关键字 |
---|---|
布尔型 | bool |
字符型 | char |
整型 | int |
浮点型 | float |
双浮点型 | double |
无类型 | void |
宽字符型 | wchar_t |
一些基本类型可以使用一个或多个类型修饰符进行修饰:
- signed
- unsigned
- short
- long
字符‘ ’ (占用1个字节;字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元)
变量类型
变量其实只不过是程序可操作的存储区的名称。C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
类型 | 描述 |
---|---|
bool | 存储值 true 或 false。 |
char | 通常是一个字符(八位)。这是一个整数类型。 |
int | 对机器而言,整数的最自然的大小。 |
float | 单精度浮点值。单精度是这样的格式,1位符号,8位指数,23位小数。![]() |
double | 双精度浮点值。双精度是1位符号,11位指数,52位小数。![]() |
void | 表示类型的缺失。 |
wchar_t | 宽字符类型。 |
C++ 也允许定义各种其他类型的变量,比如枚举、指针、数组、引用、数据结构、类等等,这将会在后续的章节中进行讲解。
字符串
-
char str[]=" "
-
string str2=""( 头文件:#include)
string(小写) 本质是一个类,
& char *
操作符两端字符串,按字典序大小的比较==,!=,<,>,<=,>=。追加 += append()
查找、替换int find(),rfind()
比较 s1.compare(s2) >0 s1>s2
存取:单个字符
修改 str[0]=‘x’; str.at(1)=“x”;
插入 str.insert(1,“111”)删除 erase(起始1,删个数3)
返回子串str.substr(1,3个)
判断字符是字母
#include <iostream> #include <cctype> using namespace std; int main() { char c; cin >> c; if ( isalpha(c) ) { cout << "c is alpha" ; } return 0 ; }
3.输入输出![image-20220302221201576](https://img-blog.csdnimg.cn/img_convert/b31c313dc65588bc7ff6fa4d004770f5.png)
cin读取数据,以空格、tab或换行作为分隔符, 若题目中有格式化要求输入则需使用scanf.
4.运算符
整/整=整
a++,a–值不变
5.分文件编写![image-20220302221533752](https://img-blog.csdnimg.cn/img_convert/ec0ebe838dc4d3953b451ebd1d77688b.png)
.h
#include
using namespace std;
void swap(int a);
.cpp
#include
using namespace std;
#include “swap.h”
void swap(int a){ }
6.指针 &取地址 野指针
与c区别结构体不用写struct
地址传递 printStu(&s);
值传递 prinStu(s);
面向对象
1.内存分区模型
C++程序在执行时,将内存大方向划分为4个区域
代码区
存放函数体的二进制代码,由操作系统进行管理的
共享,只读
全局区:
存放全局变量,静态变量,常量
os释放
程序运行后
栈区:
存 局部变量,形参,不要返回局部变量地址
由编译器自动分配释放,存放函数的参数值,局部变量等
堆区:new delete[] arr
用指针接收返回的地址,指针(本质是局部变量)
由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
内存四区意义:
不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程
2.引用
作用: 给变量起别名
语法: 数据类型 &别名=原名
本质: 指针常量
引用必须初始化,不可更改
![image-20220125114056003](https://gitee.com/wulirong/images/raw/master/20220125114103.png)
![image-20220125114108586](https://gitee.com/wulirong/images/raw/master/20220125114108.png)
注意区别:三种传递方式
3.函数提高
默认参数 int fun(int a**,int b=20**){} 放最右
占位参数 int fun(int a,int){}
函数重载 除返回值不同
- 默认参数二异性报错
- 引用void f(int &a)/ void f (const int &a)
4.类和对象
class Student{
public:
string name;
void showName(){
}
}
struct 默认权限public & class 默认private
circle.h
#pragma once 防止头文件重复包含
#include<iostream>
using spacename std;
#include "point.h"
class Circle{
public:
void setR(int r);
Point getCenter();
private:
int R;
Point c;
}
circle.cpp
#include "circle.h"
void Circle::setR(int r){ //::全局作用域限定
r=r;
}
Point Circle::getCenter(){
return r;
}
main.cpp
#include<iostream>
using spacename std;
#include "point.h"
#include "circle.h"
void isInCircle(){
}
int main(){
}
对象初始化和清理(构造函数,~类名(无参数){}析构函数)编译器自动调用
拷贝构造函数 Person(const Person &p){ age=p.age; }
//调用
//1.括号法 Person p1();错的,默认为函数声明
Person p1;
Person p2(10);
Person p3(p2);
//2.显示法 Person(10);匿名对象
Person p1;
Person p2=Person(10);有参构造
Person p3=Person(p2);拷贝构造 ,不能匿名
//4.隐式转化法
Person p4=10; //相当于 Person p4=Person(10);
Person p5=p4;
C++中拷贝构造函数调用时机通常有三种情况:
-
使用一个已经创建完毕的对象来初始化一个新对象
-
值传递的方式给函数参数传值
-
以值方式返回局部对象
默认情况下,C++编译器至少给一个类添加3个函数
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数,对属性进行值拷贝
构造函数调用规则如下:
- 如果用户定义有参构造函数,c++不在提供默认无参构造,但是会提供默认拷贝构造
- 如果用户定义拷贝构造函数,C++不会再提供其他构造函数
浅拷贝:简单的赋值拷贝操作,Q堆区内容重复释放
深拷贝:在堆区重新申请空间,进行拷贝操作
初始化列表 构造函数():属性1(值1)
Person(int a,int b) : m_A(a),m_B(b){}
类对象作为类成员
在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上
空指针访问成员函数
泛型编程,stl见下一篇🤩
补充c++11![image-20220303105916246](https://img-blog.csdnimg.cn/img_convert/730626a5f482624d57594350dfd8ff5f.png)