栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++笔记(细节)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++笔记(细节)

字节:

Short:2  int:4  long:4  long long:8  float:4  double:8  char:1  bool:1  指针:4

3e2=3x102

看某字符的ASCII码:(int)ch;

可以直接给字符赋ASCII码:char ch=97;

C++是编译性语言,编译后生成.exe可执行文件

有:

代码区:只读、共享、存放CPU执行的二进制指令

全局区:存全局变量、静态变量、常量

常量区:存const修饰的常量

栈:存局部变量、形参

堆:存数组、对象

JAVA是解释性语言,编译后生成.class文件,可在多系统(Windows,Mac,Linux等)执行(跨平台)

有:

堆:存数组、对象

栈:局部变量、形参

方法区:常量池(存常量、字符串)、类加载信息

构造函数的初始化列表是专门用来初始化成员对象的

Date d与Date * p=new Date没有括号(若有默认为函数声明),有参数时调用构造函数才有括号

explicit关键字用来防止类构造函数的隐式自动转换

此时

class CxString  // 使用关键字explicit的类声明, 显示转换 

{ 

int _size; 

    explicit CxString(int size) 

    { 

        _size = size; 

    } 

}

CxString string2 = 10; CxString string6 = ‘c’;就不行了因为发生不了隐式转换

Base *pTest2 = new Derived(); //Base类的指针(多态实现:父类指针或引用指向子类对象)

    pTest2->DoSomething();

delete pTest2;

为了防止仅调用Base的析构而不调用Derived的析构造成内存泄漏,故Base类的析构函数要用virtual修饰

写文件:创建ofstream对象 open close 对象<< write(const char * buffer,int len) 字符指针buffer指向内存中一段存储空间。len是读写的字节数

读文件:创建ifstream对象 open close 对象>> read(char *buffer,int len) 字符指针buffer指向内存中一段存储空间。len是读写的字节数

is_open():是否成功打开,返回布尔值

memset()函数原型是extern void *memset(void *buffer, int c, int count) 

清空数组: memset(buffer, 0, sizeof(buffer))

内联函数不能声明指针或外部类

引用作参数:

1.防止对象所占空间太大而调用复制构造函数

2.可以直接对该对象进行操作

cin>>get(数组名,大小,(结束符)): 若无结束语,遇到回车或达到(大小-1)则停止读取。

cin>>get():其实就是C语言里的getchar()读取一个字符

cin>>getline(数组名,大小,(结束符)):若无结束语,遇到回车或达到(大小-1)则停止读取。

getline(cin,字符串名,(结束符)):输入字符串,遇到结束符则结束。

以上结束符默认为enter,遇到结束符时剩余字符会停留在输入缓冲区,且结束符丢弃

重载强制类型转换:operator int()

{

return n;

}

模板中

typename C::const_iterator it(container.begin()):typename用于声明C::const_iterator是类型名而不是一个变量

template

class CMyistream_iterator

{

private:

       T value;

       istream ∈//使用引用的目的是减少开销,避免调用构造函数等等

public:

       CMyistream_iterator(istream &_in):in(_in) {//此处采用引用接受的目的是保证没有复制构造函数调用

              in >> value;//读入第一个数

       }

       T operator *() {

              return this->value;

       }

       void operator++(int) {

              in >> value;//读入后续的数

       }

};

.   ::   ?:   .*   sizeof不可重载

重载输出运算符:friend ostream& operator<<(ostream& out, Point& p) {

              out << p.x << "," << p.y;

              return out;

       }

普通函数参数为函数时:可以

void fun(int fun2(~)):~依据需求填写,可以不写变量名

void fun(int (*fun2)(~)) 函数体内直接fun2(~)即可,*无影响,当成附加的东西即可

若为模板函数则

Template

Void fun(T fun2){

fun2(~):~依据需求填即可

}

对象数组初始化:{{},{},{},{}~}——{}中的参数调用该类对应的构造函数

自定义二维数组构造器:

Int **p;

Array2(int a, int b) {

        m = a;

        n = b;

        p = new int* [m];

        for (int i = 0; i < m; i++) {

            p[i] = new int[n];

        }

    }

   重载[]:

 int*& operator[](int i) {

        return p[i];

    }

static_cast<类型>(变量):类型转换

类成员变量所占空间对齐

class Person {

public:

       Person operator+(const Person& p) {

              Person temp;

              temp.m_A = this->m_A + p.m_A;

              temp.m_B = this->m_B + p.m_B;//参数对象也可直接访问私有成员

              return temp;

       }

private:

       int m_A;

       int m_B;

};

Sample a=b调用拷贝构造函数

Sample a;

a=b指向同一对象,地址复制

常函数不可更改本类成员变量

// 第一个const表示返回值是个常量,用来防止 (p1+p2)=Point(10,20); 这种赋值

       // 括号内第二个const表示传入的参数可以接收const也可以接收非const

       // 第三个const表示常量可以调用该函数     

       const Point operator+(const Point &point) const {

              return Point(m_x + point.m_x, m_y + point.m_y);

       }

  • Point p1 = (10, 20);

       Point p2 = (20, 30);

      (p1 + p2) = Point(40, 50); // 如果不加第1个const,则这里不会报错(应当让常量不能被赋值)

  • Point p1 = (10, 20);

        const Point p2 = (20, 30);

        Point p3 = p1 + p2; // 不加第2个const,这里会报错,因为p2是常数

// 注意,这里p1是变量,p2是常量,由于重载了“+”

// 上一句代码等同于 p1.operator+(p2);

// 将p2视为了参数,即将常量视为参数。

(应当让常量也可以参与运算)

  • const Point p1 = (10, 20);

        Point p2 = (20, 30);

        Point p3 = p1 + p2; // 不加第3个const,这里会报错,因为p1是常数

// 注意,这里p1是常量,p2是变量,由于重载了“+”

// 上一句代码等同于 p1.operator+(p2);

// 由p1调用的operator+函数,因此调用该函数的是个常数。

(让常量可以调用函数)

Point& operator+=(const Point &point) { // 返回值要注意

       this->m_x += point.m_x;

       this->m_y += point.m_y;·

       return *this;

}(p+=p1,p1可以是常量,p为变量)

Point& operator++() {} // 默认代表重载++a(a为变量)

const Point operator++(int) {} // 传入参数写int代表a++,固定格式。不能返回局部变量的引用

返回值为引用时,不调用复制构造函数

Static成员需要类外初始化

#include

atof(字符数组.c_str()):返回该字符串对应的double值,类似于java中的Double.parseDouble(字符串)

atoi(字符数组.c_str()):返回该字符串对应的int值,类似于java中的Integer.parseInt(字符串)

gcvt(double值,8(精度),字符数组):取double值8的精度存到字符数组中,类似于java中的double值+“ ”

itoa(int值,字符数组,10(进制)):取int值以10进制存到字符数组中,类似于java中的int值+“ ”

静态成员变量需要在类外初始化;

静态函数只能调用静态东西

常函数和普通函数啥都能调用

常对象只能调用静态成员函数和常成员函数

普通对象和静态对象啥函数都能调用

int *a[5]:数组名是a,每个元素为指针类型

int (*a)[5]:数组名是a,每个元素是数组类型

子类可以调用本类对象继承来的保护性成员,但不能调用父类对象的该保护成员

Son son

son.Father::m:继承中有同名属性想访问父类的属性时

virtual void fun()=0是纯虚函数,使其子类可以重写

当有virtual修饰类时,多继承时该类指向同一块区域,不需要限定访问权限(不需要d::B.a,直接d.a),解决二义性。

C语言独有:

getchar()读取一个字符

gets()读取字符串

Char *a=“abc”;

十进制输出:%d

八进制输出:%o

十六进制输出:%x

字符串输出:%s

字符输出:%c

浮点形式输出:%f

C/C++中的strcpy(),strcat(),strlen(),strcmp()都是操控字符数组的

闰年二月29天,平年二月28天

当一个cin对象作为条件选择、循环等的控制表达式时,输入Ctrl+Z可终止循环(cin的返回值依然是cin对象)

拷贝构造函数三种调用情况:

  • 用对象初始化另一对象
  • 对象做参数
  • 返回局部变量

Person p2=Person(p1);

Person p3=p1;

Person p4(p1);

当指针属性在堆中开辟空间,就自己提供拷贝构造函数,否则系统提供的默认复制构造函数是浅拷贝,会带来重复释放堆区的问题。

浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。

成员函数用const修饰后

void show () const {

  this->m=100;//若属性m有mutable修饰则可以更改,否则不行

}

查看运行类型:

C++:typeid(对象).name()

JAVA:对象.getclass().simplename()

分文件模板放在.hpp文件中

cpp中引入该头文件

string类初始化:

  • const char* str=”hello”;
  • string str(10,’a’):10个a构成
  • string str=”hello”;
  • string str;

str.assign(“hello”)

  • string str;

str.assign(5,’x’)

string类方法

  • +
  • append
  • find():返回下标
  • rfind():返回最后一个下标
  • replace(1,3,“abc”):将从1始3个字符换成abc
  • compare():若相等返回0
  • size():字符串长度
  • at、[]可访问
  • insert(num,”abc”):在num处插入abc
  • erase(1,3):删除从1始3个字符
  • substr(1,3):从1始截取3个字符

JAVA:ArrayList自动扩容  10  *1.5

         Vector自动扩容    10  *2

C++:手动扩容

模板实现具体化,前缀+template<>即可

template<> bool myCompare(Person& p1, Person& p2)

{

if (p1.m_Name == p2.m_Name && p1.m_Age == p2.m_Age)

{

        return true;

}

else

{

       return false;

}

}

Vector初始化:

  • vectorv2(v1.begin(),v1.end())
  • vectorv(10,100):10个100
  • vectorv3(v1)

vector

deque

stack

queue

list

set

map

增

Push_back()

Push_back()

Push_front()

Push()

Push()

Push_front()

Push_back()

删

Erase()

Clear()

Pop_back()

Pop_back()

Pop_front()

Pop()

Pop()

Clear()

Erase()

Pop_back()

Pop_front()

Remove()

Erase()

Erase()

Clear()

改

查

[]、at()

[]、at()

大小

Size()

Size()

Size()

Size()

Size()

Size()

容量

Capacity()

无

指定大小

Resize()

Resize()

Resize()

插入

Insert()

Insert()

Insert()

(插入后自动排序)

Insert()

(插入后根据值自动排序)

空

Empty()

Empty()

Empty()

Empty()

Empty()

Empty()

头

Front()

Front()

Top()

Front()

Front()

尾

Back()

Back()

Back()

Back()

交换

Swap()(自换可收缩容量)

Swap()

Swap()

Swap()

反转

Reverse()

预留空间

Reserve()

迭代器

iterator

iterator

iterator

iterator

Const_iterator

备注

Set不允许重复插入数据,multiset可

Map不允许有重复key,multimap可以

函数对象即仿函数是重载了()的类

若返回的是bool类型,则该仿函数也叫谓词(一个参数就一元谓词,两个参数就二元谓词)

List不可跳跃访问(即不可it=it+1;但可it++)

cout<< a(3, 4) or  A()(3,4);//可以直接通过类对象()调用重载函数

for_each(a.begin(), a.end(), A() or a);//做仿函数不需要写参数,普通函数可以直接写函数名

内建仿函数:
  • plus
  • minus
  • multiplies
  • divides
  • modulus:取模
  • negate:取反
  • greater
  • greater_equal
  • less
  • less_equal
  • equal_to
  • not_equal_to
  • logical_and
  • logical_or
  • logical_not

STL算法:

遍历:
  • for_each(beg,end,fun)
  • transform(beg1,end1,beg2,fun): 搬运容器到另一个容器中

查找:
  • find(beg,end,value):返回迭代器
  • find_if(beg,end,fun):按条件找
  • adjacent_find(beg,end):找相邻重复元素的第一个的迭代器
  • binary_search(beg,end,value):找到返回true
  • count(beg,end,value):统计个数
  • count_if(beg,end,fun):根据条件统计个数
  • lower_bound(beg,end,value):用二分查找的方式查找第一个>=value的数的指针
  • upper_bound(beg,end,value):用二分查找的方式查找第一个>value的数的指针

排序:
  • sort(beg,end,fun)
  • random_shuffle(beg,end):随机排序
  • merge(beg1,end1,beg2,end2,destination):合并两有序容器中的元素到新容器
  • reverse(beg,end):反转

拷贝、替换:
  • copy(beg,end,destination)
  • replace(beg,end.old,new)
  • replace_if(beg,end,fun,new)
  • swap(container1,container2)

算数生成(包含numeric):
  • accumulate(beg,end,value)
  • fill(beg,end,value):填充

集合:
  • set_intersection(beg1,end1,beg2,end2,destination):
  1. 两集合元素有序
  2. 目标容器指定大小为min(v1,v
  3. 返回值是交集最后一个元素的迭代器
  • set_union(beg1,end1,beg2,end2,destination)
  1. 两集合元素有序
  2. 目标容器指定大小为size(v1)+size(v
  3. 返回指是并集最后一个元素的迭代器
  • set_difference(beg1,end1,beg2,end2,destination)
  1. 两集合元素有序
  2. 目标容器指定大小为max(v1,v2)
  3. 返回值是差集最后一个元素的迭代器

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873218.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号