C++学习笔记1
本人是是大一学的C,现在大二新开了C++。于是便开始入手C++。所以一开始就没有无所谓的基本的总结。直接是从C过渡到C++。看的是大哥的视频。只想说:大哥的视频不是叼!!是碉堡了!!!附上视频地址:https://ke.qq.com/course/115806#term_id=100125780
学C++的赶快去看吧,你值得拥有!!
对C++的初步认识
C++中区分大小写,但是在window下头文件不区分大小写。
封装性:把数据和方法联系在一起形成一个具有类特征的对象,封装好的对象就具有明确的功能和方便的接口,以便其他类型引用。另外封装的对象也有各种访问权限,防止被外界非法获取或更改。
继承性:同类事物具有共同性,在同类事物中每个事物又具有特殊性。运用抽象的原则舍去对象的特殊性,抽象其共同性,则得到一个适应于一批对象的类,被称为基类(父类),而把具有次特殊性的类成为派生类(子类)。派生类的对象拥有其基类的全部或部分属性与方法,成为派生类对基类的继承。
多态性:对同一种消息,多个对象有完全不同的表现行为。即一个对外接口,多个内在实现方法。
1. 在C中不支持表达式做左值, 即在C中a=b=100可以,但(c=d)=200不可以,因为(c=d)为表达式。在C++中表达式可以被赋值。
a=b=100;//运算过程:先将100赋给b,然后再将b赋给a,此代码在C中也可以。
(c=d)=200;//运算过程:先将d赋给d,再将200赋给c。等价于c=d;c=200,此代码只能在C++中通过。
2.关于常量、指针常量的初步认识
const int a=100;
int b=a;
/*const int * const pa;//error
第一个const定义的是pa所指向的变量为常量,其值不能改变,所以应在定义时初始化,否则以后不能初始化,但可以编译过去。
第二个const定义的是指针pa为常量,其值不能改变,所以会报错。
正确写法:const int * const pa=&a;
*/
const int *pa;//此行只是定义pa指向的变量为常量,所以指针可以被赋值。
pa=&a;
//*pa=50;//error 此时pa所指向的变量a为常量,不能修改其值。
//int *pb=pa;//error 指针pa所指向的变量为常量,而pb所指向的则是一个变量,其类型不一样,不能将两个不一样类型变量的地址赋值。
const int *pb=pa;//此时将pb指向的变量定义为常量,则可以。
cout<<*pa<<endl<<*pb<<endl;
3.string
(1)string用于定义声明字符串变量。
(2)其定义声明与普通类型声明一样,初始化的方式:
1.string 变量名=“字符串常量”;
2.string 变量名(“字符串常量”);
3.string 变量名(整数,“字符串常量”); 此初始化方式理解:将字符串常量以整数为倍数,几倍初始到变量名中。如:string a(3,"a"); 字符串变量a中有3个a。
(3)字符串之间的连接用+。
(4)size()成员函数:用于返回string对象大小(包含的字符数,包括空格)的无符号整型值。用成员选择运算符(.)调用。
(5)索引string对象:用下标运算符([]),可像字符数组一样访问字符串中的任意一个字符。其下标也是从0开始。
(6)find()成员函数:用于检查两个字符串字面值是否含有相同的字符。该函数返回值是要搜索的string对象在调用string对象中第一次出现的位置。其返回值总是比真实位置少1(因为其下标是从0开始,即若查找的字符串值在第4位出现,则返回值为3.)。若没找到,则返回string中定义的一个特殊常量,该常量通过string::npos来访问。(即if(a.find("bb")==string::npos){cout<<"未找到";})。
可向find()提供一个可选实参用于指定其查找起始位置。:a.find("bb",3);从字符串a第三个位置开始查找。
(7)erase()成员函数:从字符串中移除指定的子字符串。
调用该成员函数的形式:字符串对象.erase(位置,长度); 如:a.erase(2,3); 移除字符串a中从位置2开始长度为3的子字符串。
(8)empty()成员函数:该成员函数返回bool类型值,若为空,返回true。为假返回false。
4.C++的输入输出
C++流默认输出是6位
cin、cout为类对象,scanf、printf为函数
对于实型,cout 默认输出六位有效数据。
setw()用于指定域宽,头文件为iomanip。
setiosflags(ios::left)用于左对齐输出。
setprecision(n)<<setiosflags(ios::fixed)合用,可以设置小数点右边的位数。n表示小数位数。
setfill("字符")用于指定字符填充,其为全局。
注意 : 默认的cout输出是十进制,
但当改变格式输出后,其默认则不再起效,输出格式变成最后的格式。
当程序结束关闭再次打开时则还是默认为十进制输出。
int a;
cout<<"输入一个数:";
cin>>a;
cout
<<"默认输出:"
<<a<<endl;
cout
<<"十进制输出:"
<<dec<<a<<endl;
cout
<<"八进制输出:"
<<oct<<a<<endl;
cout
<<"十六进制输出:"
<<hex<<a<<endl;
cout
<<"此时再用默认输出时,其默认输出指定为最后一次的格式输出"<<endl
<<"默认输出:"
<<a<<endl;
cout
<<"指定域宽输出:"<<endl
<<setw(8)<<dec<<a<<endl;
cout
<<"左对齐输出:"<<endl
<<setw(8)<<setiosflags(ios::left)<<a<<endl;
5. 函数重载
重载和默认参数不能同时使用。
函数重载原则:函数名相同、函数参数表不同(参数类型、参数个数、参数顺序)
函数返回类型不同不能构成重载。
匹配重载函数原则:
严格匹配,找到则调用。
通过隐式转换寻求一个匹配,找到则调用。
注意:
int到long和double,double到int和float隐式类型转换
遇到这两种情况则会出现二义性导致错误。
重载的原理:利用倾轧技术,将函数名进行倾轧。
倾轧发生在两个阶段:.cpp编译阶段和.h的声明阶段,
只有两种阶段同时进行才能匹配调用。
避免倾轧的方法:在函数前加extern "C"
int print(int a)
{
cout<<"参数是数字"<<endl;
return 0;
}
int print(char b)
{
cout<<"参数是字符"<<endl;
return 0;
}
int print(char b,int a)
{
cout<<"参数是字符、数字"<<endl;
return 0;
}
int print(int a,char b)
{
cout<<"参数是数字、字符"<<endl;
return 0;
}
6.运算符重载
运算符重载:其本质就是定义了一个函数,用operator关键字定义。
struct COMP
{
float real;
float image;
};
COMP operator+(COMP one,COMP another)
{
one.image+=another.image;
one.real+=another.real;
return one;
}
int chongzai()
{
COMP num1={1,2};
COMP num2={3,5};
COMP sum=num1+num2;
cout<<"("<<sum.real<<","<<sum.image<<")"<<endl;
return 0;
}
7.引用
1.引用没有定义,是一种关系型声明。
声明它和原有某一变量(实体)的关系。故而类型
与原类型保持一致,且不分配内存。与被引用的变量有相同的地址。
2.声明的时候必须初始化,一经声明,不可变更。
3.可对引用,再次引用。多次引用的结果,是某一变量具有多个别名。
4.不能建立引用的引用,但可以对引用再次引用。【int &rb=ra】
可以对引用取地址【int *p=&ra】
常引用:
const 不可改变,不可通过指针或引用去改变。
const 对象的引用必须是const 的,将普通引用绑定到const 对象是不合法的。
const 引用可使用相关类型的对象(常量,非同类型的变量或表达式)初始化。
使用const的原因:
1,使用const 可以避免无意修改数据的编程错误。
2,使用const 可以处理const 和非const 实参。否则将只能接受非const 数据。
3,使用const 引用,可使函数能够正确的生成并使用临时变量(如果实参与引用参
数不匹配,就会生成临时变量)
int a=4;
const int b=5;
nt &ra=a;
//const int *p=a;//error const 对象的引用必须是const 的
const int &rb=b;
cout<<"a="<<a<<endl<<"ra="<<ra<<endl;
cout<<"b="<<b<<endl<<"rb="<<rb<<endl;