学习C++的一些笔记(一)

1.命名空间 using namespace std 基于标准库的东西都在std里面,把整个命名空间运用到程序里(如果只想用部分,一般为using std::cout,using std::endl,这种叫using声明机制,如果不用声明机制,还想使用std里的东西,一般在程序中,用std::cout <<   ……<< std::endl),cout是一个标准输出流对象,<<为函数重载运算符,endl为操纵符, 换行作用。 :: 为域运算符。以上叫有名值命名空间,输入流是cin, >>,cin是根据空格来分隔,只要碰到空格,就代表已经输完。命名空间主要是为了消除相同的函数名跟变量
2.匿名命名空间,使用C语言中的全局变量就要使用到匿名命名空间,如 ival =100; int main(int 啊若干次, char* argv[]){……cout<<“ival = ” << ::ival<< endl;} ::ival即为匿名命名空间。
3.定义命名空间 为 namespace my_name
{
……
}    
里面内容为一些函数,或者变量等
使用时,需要加上命名空间,如my_name::函数或者变量
4.C++中多了一个bool类型变量(C中使用需要定义头文件#include<stdbool.h>),只有两个取值,1和0,1为true 0为false,占1个字节
5.C中定义一个常量,一般是使用枚举,或者宏,C++用const变量,当指针指向一个const变量时,需要添加const,否则报错,如,const int ival = 10; const int *pival =&ival;含义为指针指向一个const变量,该值不可修改。注意,int *const pival 为一个常指针。指针的值是不可变的,去常量的属性要用 const_cast<int* >(&val)(主要是用在函数传参上,如果用其改变const值,会发现原来的const值未改变.因为*pival 是个未定义行为);注意,必须用地址跟指针,而且不会修改常量值
6.C++中的强制转换符用static_cast<……>,如,int ival = 20; double dval = static_cast<double>(ival);
7.C++中独有的一个是引用,相当于一个变量的别名,用取地址符表示,如:int ival =10; int &refval =ival; refval就相当于ival的别名。一旦改变引用,就相当于改变了本体。在C中交换两个数需要指针,int swap(int *a, int * b)而C++中直接用引用,不需要传地址,如int swap(int &a, int &b),是对交换两个数取别名,一个是a,一个是b。函数也可以引用,如,int a[] = {0,1,2,3,4};
int &fun(int idx)
{
  return a[idx];
}
int main(void)
{
fun(3) = 100;
}
8.在C中申请空间的是malloc或者calloc(arr = (int*)calloc(SIZE, sizeof(int)))释放是free,而C++中申请是new删除是delete, 如,int *pval =new int; 如果不赋初值,new int 为0, int *pval = new int(3); 则是初值为3(new与calloc不同在于,new可以自己定义初始值,而calloc的初始值为0)。 如果要申请多个空间,则应该改为[],如,int *pval = new int[10]; 则申请了10个空间。释放空间用delete,如delete pval; 释放多个空间用,delete []pval;一定要记得释放(new还有一种定位运算符,格式为:
p1 = new(buffer1) int[20], 意思为在固定位置buffer1中开一块空间给p1所指向的int数组)
9.在C中没有函数重载机制,而C++中有,也就是可以命名相同函数名,不同形参类型。通过形参的类型,个数,顺序,自动查找,究竟该调用哪个函数
10.在C++中可以运行C的函数是因为,在C中的头文件都有以下宏定义,其中的内容就是不进行名词改编,为C中的函数。
#ifdef __cplusplus
extern “C“
{
#endif
内容……

#ifdef __cplusplus
}
#endif
11.C中对于短函数,一般采用是的宏定义的方式,减小开销,而C++中采用的是内联函数的方式在函数前加上 inline,如,
inline int max(int a, int b)
{
return a>b ?a:b
}
在函数申明时,可以不用inline,inline必须跟函数定义体放在一起
12.C++中可以给函数中的参数赋一个值,也就是带一个默认的参数,即,只需要调用函数时赋一个值就可以,也可以在调用时修改默认值,函数默认值赋值规则是必须从右往左赋值,不能跳跃,在用默认参数类型时, 需要注意函数二义性
13.C++中可以直接定义字符串,需要头文件#include<string>,然后,定义则是std::string s1 = ”,也可以用,std::string s2(“"),在C++中把两个字符串连接在一起 就用s3 = s1 + s2,即可(C中需要用到strcat函数),同理可以一个字符串跟一个字符拼接
14.C++中可以截取字符串中一部分,用substr(X,Y),X,Y为起始位,跟终止位。如,string s3 = s2.substr(0, 5);
15.字符串长度用size(),如s2.size(),就是s2字符串的长度。另外字符串可以像数组一样访问,如求,第几位的字符,s2[index]
16.要把字符串1个个读出来,有两种方式,传统方式如,
for(i = 0; i != s2.size(); i++)
{
cout << s[i] <<endl;
}
第二种方式则是用迭代器,如,
string::iterator it = s2.begin();
for(; it != s2.end(); ++it)
{
cout << it <<endl;
}
17.为什么,cin是>>, cout是<<,因为cin是从终端把输入内容保存在s1内,cout是把s1的内容输出到cout内
18.getline函数是输出一整句。以回车结束,回车之前的所有内容都当成字符串。如:getline(cin, s1)
19.字符串流,头文件#include<sstream> ,功能是输出每一个字符串中的单词,以空格为分界线,(类似于cin),如:istringstream iss(s1);就是判断s1中的单词
20.vector是同一类型对象的集合,vector容器在头文件#include<vector>里面,vector里面能放任何类型的东西,但是一旦定义号vector后不能改变,使用需要std::vector

如std::vector<int> vec;其中 vector的空间是动态扩展,而且永远比用户输入的空间大。一旦往里填数据达到最大值时,就开辟一块自己的空间大小2倍的心空间,然后把数据赋值到新的空间里去,释放掉原来的空间。往vector中添加数据用push_back(val),如 vec.push_back(10),则就是把10 添加到vec的末尾中,如果要添加到头中,用push_front(),删除元素用pop_back(),pop_front()

21.vector的遍历过程有几种,(1)类似于,string,
for(i = 0; i < vec.size(); i++)
{
cout << vec[i]<<endl;
}
(2).是迭代器的方法,如
vector<int>::iterator it = vec.begin();
for(; it != vec.end(); it++)
{
cout << *it <<endl;
}
(3).是for_each的方式
头文件#include<algorithm>
for_each(vec.begin(), vec.end(), print);
for_each其实是一个算法,通过一个回调函数print,从迭代器的范围把数值打出来
(4).在C++11标准中用
for(int idx : vec)
{
cout << idx << endl;
}
即可,不过由于是C++11,编译时要加上 g++ -std=c++11 *.cc
22.vec.capacity()是查看vector的容量大小,而vec.size()是查看vector拥有的数据个数
23.C中复制一个数组,要用memcpy,而在C++的vector中,只需要直接复制即可,如:vector<int> vec2(vec);如果只要复制一部分,可以通过限制迭代器的范围,然后来复制,如,vector<int> vec3(vec.begin(x),vec.end(y)); 其中x ,y为起始位跟结束位
24.C++中标准输出流有bad,fail,of,good这几种状态(都为bool型),good代表可以输入,eof代表是否读到文件末尾,bad代表出现系统级错误,fail代表输入数据非法
如果,输入非法数据后,还想继续使用当前流,需要将流清空,需要使用cin.clear()函数。但cin的缓冲区还留有非法数据,需要使用cin.ignore(1024,  ‘\0’)函数,第一个数据(1024)代表需要忽略缓冲区里多少个数据,第二个数据代表(’\n’)代表一旦读到\n时,不管前面读了多少个数据,都将其清空
25.文件的输入输出流主要包括3个类型,ifstream(读(ifstream ifs(“文件”))),ofstream (写(ofstream ofs(“文件”))), fstream,头文件都是#include<fstream>,每一次读取都要判断文件准备好没有(if(!ifs.good()))
26.字符串输入输出流也有3种,isstream,osstream,ssstream(类似于C中sprintf),字符串流一般用来进行一些格式转化 如将 数字转化为字符串,先将数字写入stringstream流中(ss<< ival << endl),然后需要使用函数str(string str = ss.str())将数字转化为字符串
27.面向对象最本质的东西是1.封装。2.消息传递。面向对象的四大特性:抽象性,封装性,继承性,多态性
28.struct的访问权限默认为public,class默认为private(里面函数只要写全的都是内敛函数,相当于在前面加上了inline,class的public相当于接口),私有的类(一个class里可以有多个private),外部访问不了,要访问需要在public里面调用函数。或可以直接定义一个函数直接调用,如:Student(int id, string &name,  int age),但一旦这样,直接定义Student s时,编译会报错,因为Student s也调用一个函数,为默认构造函数(编译器隐式生成,Student () {})当我们构造了。Student(int id, string &name,  int age)函数时,Student () {}则不起作用了,如果需要,则需要我们显式的将其构造出来,class中还有一种为protected,该类型只对子类开放,其他访问不了
29.当文件拆开为成头文件时,类中的函数只需要写声明即可如:
class Stu
{
public:
 void print();
 void setId();
}
30.当成员函数末尾加上const表示。对该函数不做修改,如void print() const(与void print()不同,相当于函数重载); 如果主函数中有const想要调用成员函数,只能调用含有const 的成员函数,其他的不能调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值