我的C++

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mr_henry_love/article/details/80689019

l C++ 中引入头文件的时候, 不带.h. 例如#include<iostream>

l C++比C 多了一个命名空间的概念, 这个有点类似C#的导库. 用法例如 using namespace std;

l C++ 一样有sizeof 这个方法可以用于获取数据类型的长度或者是变量的字节长度

l C++ 以及C 中的枚举和java 中区别很大, 前者的枚举不需要加枚举名, 直接用, java的枚举是必须加上枚举名的, 除了在switch 中

l C++中一样是有typedef 关键字用于定义自定义的类型, 给已有的数据类型取别名, java中是没有的. C++ 中已经有bool 值了, 而且名字和C#是一样的, 和java 不一样, java中的布尔值是boolean,

l C 和C ++ 和java 一样也有全局变量,  C和C++中对char 的初始值是’\0’, 而java中char 的初始值是’\u0000

l C++一样是可以用const 或者是#define 来定义一个常量

l C 和C++ 中如果在定义局部变量的时候加上一个static的话,那么这个定义变量并初始化的声明只在第一次执行的时候有效, 例如在一个方法中有这样一句话, static int a = 10;  然后后面改变这个值, 那么第二次再执行这个方法的时候, 这个值不会再被重新赋值为10了, 跟java 不一样, java中局部变量根本就不能够使用static关键字修饰

l C++ 中已经有string类型了, 都是小写的, C++ 中的string是小写的, 但是java 中的String 是首字母大写的.

l C++ 的continue 也是不可以指定 继续具体哪个循环. C, C++ 都只能跳出当前循环,但是java 是可以跳出指定循环的, 只要加一个标记就可以了

l C ++ 函数的形式参数是可以由默认值的, 例如 int max(int a, int b=20){}. 在外部调用这个函数的时候, 如果有为b赋值的话只会使用赋值的值, 如果没有的话就会使用默认值20;

l C++ 的cos 或者sin 函数这些后面传递的都是一般的度数, 如90度, sin(90)=1; 这点和java 是不一样的, java中cos后面穿的是三角函数值

l C++ 中一样可以用printf() 函数来打印地址值 , 用”%p, 用C++的cout输出地址值的话需要强转才可以, 把一个字符串的指针强转成void * 就可以了, strcat 是先将前面一个字符串最后的结束符去掉, 然后加入后面一个字符串, 在输出sizeof() 的时候, 不会改变左边字符串的长度, 但是strlen的话, 是改变了的, 因为他会一直往下读直到遇到’\0’.  使用strcat 方法的时候必须保证前面一个字符串有足够的空间可以容下后面一个字符串, 其实也可以直接cout<<&变量. 这样也是可以的

一个char* 的变量, 也是可以用&取地址运算符来获取地址的

l C++ 的引用类型是这样的, 声明一个引用变量指向一个真正的内存. 引用和指针的区别是: 首先引用必须指向一块合法的内存, 引用必须是在声明的时候就指向一块内存, 而指针可以在任何时候赋值, 引用初始化之后就不能再指向另一个内存, 但是指针是可以的

l Time() 函数是获取时间, time(0) 返回当前时间. Ctime() 是把当前时间转为字符串, 例如转成 星期几, 几号, 几时几分几秒, 多少年, 几月,

当前时间的描述可以转为为对应的年月日时分秒之类的单个数值,使用的是localtime(time_t * time) 这个函数, 返回一个tm* 的指针变量, 通过这个指针变量可以指向tm_year, tm_month 之类的数据, 注意的是tm_year 返回的是基于1900年开始的数据, 也就是说假如2016年那么返回的就是116. 然后月份是从0开始的

l C++ 继承一个类的写法是, class A :public B{} 意思就是说A 这个类继承B 这个类, 同时把B类中的public的属性仍然置为public, protected 的属性置为protected.  如果是protected 继承的话意思就是把B类中的public和protected 的属性都置为protected的,

l C++ 支持多继承. 这点和java 以及C# 都是不一样的, java和C# 都只支持单继承, 但是支持多实现

l C++ 中如果子类重载了父类的方法那么父类的方法就失效了, 但是可以加上这样一句话就可以使用父类的方法了, using Basecalss:: 方法名;  这句话的意思就是把父类中的同名方法的作用域扩大到子类

l C++ 中函数重写的机制跟C# 很像 ,也是要先在要被重写的类上写一个virtual关键字, 然后在子类中重写就好了, 如果要调用父类的同名方法可以写Baseclass::方法名();  如果父类的这个函数不加virtual的话,那么父类引用指向子类对象的时候就会调用父类的方法而不是子类的方法

l C++ 的运算符重载跟C# 是不一样的, C++ 的运算符重载: 一个类A 中重载了+运算符, 这样写 int operator+(A a){}; 调用的时候就是A a, A a1, a+a1,    C#重载如下: int operator+(A a, A a1){}. 用法一样,但是写法是不一样的

l C++ 中virtual关键字的意思就是让编译器在编译的时候,按照真正的对象的类型来确定指向的方法. 动态链接, 而不要静态地确定地链接到这个方法,C#也是这样的, 但是java中是不需要这样做的,直接用就可以了

l C++ 的基本数据类型也是可以用new 这个关键字的, 这个跟java’ 是很不一样,. 如果是初始化一个基本数据类型的话, 那么括号里面的东西就是初始化的默认值.

l C++ 中的类似乎也是有默认的空参构造的

l C++ 的抽象方法实际上就是纯虚函数, 用virtual int add(参数列表)=0; 用这种来表示纯虚函数, 一个纯虚函数是必须被实现的

一个带有纯虚函数的类就相当于是一个抽象类, 是不可以用创建对象的 . 不管是通过声明的方式, 还是通过new的方式, 都会报错

l C++ 中应该是没有interface 这个关键字的

l C++ 中的delete也是用来回收内存的, 例如创建了个对象返回了一个指针, 那么调用delete(指针) 就会回收这个对象, C++的析构函数就相当于是java中的finalize 函数, 都是在回收对象. 用free 释放内存的话是不会调用对象的析构函数的, 但是用delete 的话是会调用析构函数的,delete 一般和new 成对使用, new 用于创建对象, delete 用于删除对象, free一般是和malloc 或者是calloc成对使用, 是用于释放内存的.

一个对象在退出作用域之前是肯定要销毁对象的, 不然的话在其他地方就无法回收了. 然后销毁的时候调用delete 回收对象, 调用析构函数

l C++中嵌套的命名空间可以通过using namespace outer::inner 这样来指示

l C++ 中的string 可以直接当成字符数组来用

l C++ 是不检查数据越界的, 即使越界也不会报错

l Cout.put(); 这个是输出一个字符, 传一个数字进去就会输出对应的字符

l Wchar_t 是宽字符集, 占两个字节.

l C++ 中的布尔值可以提升为int值. 其中false 等于0, true 等于1.

l C++ 中可以使用3.4e2 表示340, e2 代表10的平方

l C++中在给数组赋值的时候可以只赋一个空的大括号, 这个表示将这些数组内部的所有元素初始化为0;

用字符串常量给字符数组赋值的时候. 要保证字符数组的长度至少比字符串的长度多一, 否则编译都会报错

l C++ 中的结构体也是可以用new 的, 只不过没有构造函数而已, 应该说一切都是可以用new 的, 用new 只是表示这段内存是在堆中申请的而已

l C++ 中在读文本的时候好像如果中间有鼠标分隔符也会报错用fin>> 的时候

l C++ 中的字符串结束符\0 实际上就等于ascall码表中的值为0的字符. 所以也可以用作bool判断,. 值等于false

l Ifstream>> 在读文本的时候, 如果要读连续的3个数字, 那么要加个空格, 试了一下, 加逗号不行, 不加的话, 就会把整个当成一个数字

l C++ 中的数组名实际上就是当前数组的首元素的地址值, 但是数组名和指针的区别是, 首先指针是可以改变的, 可以改成指向别的内存, 但是数组名是不可以改变的, 还有就是对数组名用sizeof得到的是整个数组的字节大小,但是对指针用sizeof的时候, 得到的是指针的长度

对数组名取地址的话, 得到的地址是和数组名一样, 都是这块内存中第一个元素的首地址, 但是如果进行加减运算的时候就不一样了, 对于数组名来说, +1 意味着地址移到到下一个元素, 但是对数组名取地址值然后加1 的话就是移动到整个数组的末尾的后一个地址了, 写法是例如 int(*pas)[len]=&b, 其中b是一个int的数组, 长度是len;

一个指针即使指向的不是一个数组也是可以用数组表示法来修改值, 很好理解, int *p; p[i] 的意思就是在p的地址的基础上移动i个int单位地址.

l Char *指向的字符串是不可以修改的, 可以修改char * 这个指针让他指向别的字符串, 但是不可以修改原来的字符串的字符. Char 数组可以.

l Strncpy(char*, const char *, int maxsize); 最多复制多少个字节给目标字符串, 如果到达最大字节还没把字符串复制完的话, 不会添加\0.需自己添加. 这一点和cin.getLine(str, int maxsize) 有点不太一样, 后面这个是如果还没遇到enter键的话, 会最多只读maxsize-1 个字符, 然后加上一个\0字符结尾

l New 和delete可以在不同的函数中, 只要指向的地址值是同一块就好了, 但是这样的话, 就是怕会忘掉.

数组的体代表vector和array, vector是创建在堆中, array是在栈中.

l C++ 开始引入了bool, 其中在转换为数值的时候, false为0. True 为1. 在需要bool值的时候,. 会把0转为false, 其他转为true

l 用fstream读取 文本的时候,. 不论是打开失败, 还是已经读到文件末尾都可以用!Fstream来做判断, 当打开失败或者是读到文件末尾的时候fstream都会被转为false.

在创建单链表的时候, 最好是从末端开始一个个往上创建.

一个指针在创建的时候最好赋值.不然的话会报错的,. 不然的话, 不知道指向哪一块内存,  最好是创建的时候就让他指向NULL

l C++中的extern的作用也就是说这个变量或者函数是在其他的cpp文件中定义的, 我这里只是用来引用而已.然后这个变量无论是在哪个文件中被修改都是生效的, 另一个文件在引用的时候也是用的新的值了

l String 的赋值并不是传递地址值, 例如, string a=”henry”. String str1= a; 如果是地址传递的话,那么改变a里面的字符, str1也是会改变的, 但是事实是这并不会. 应该说, string都不是一个地址值,. 是一个模板类的对象,  妈的很明显啊, 如果是地址值的话,那么他在调用方法的时候就应该是->了

l C++ 中的vector已经可以起到和list一样的效果了. 添加元素是push_back, 创建的时候也是要输入泛型的.  然后可以先不用确定长度,获取位于某个下标的元素是at方法,  用size()方法获取到这个数组内部的元素的总数,

l Ifstream.open 在打开一个文件的时候如果成功了,那么调用is_open方法返回true否则返回false, 所以这个函数可以很好地用来判断打开文件的结果, 或者也可以用good这个方法来做这个判断

l Java 中可以转换int 的数在执行操作的时候都会提升为int, 但是C++ 不会, 例如: char c=’1’, char ch=c+1; 输出ch等于2, 这里并不报错,

l 对一个变量的引用就是相当于使用这个变量, 这样理解就好了, 也就是说本来一个变量在初始化之后, 别的变量不可以再次使用这个地址值, 但是用引用的话也就是说这个变量存的地址跟那一个是一样的, 所以说两个变量的地址值是一样的, 所以说用变量和变量的引用是一样的效果

l C++ 中string+在调用的时候如果后面是一个int数, 那么他会把这个int数转成字符然后添加. 所以如果一个string str=””的话, 那么他在+1 的时候不会变成”1”而会变成奇怪的字符串

l 不知道为什么有时候在传参的时候接受double的形式参数竟然不能直接接受一个int数, 还他妈要强转;

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页