1.标准输入输出
cin 表示标准输入,即stdin
cout 表示标准输出,即stdout
clog 表示标准错误,带缓冲的标准错误
cerr 表示标准错误,即stderr
hex表示十六进制,oct表示八进制,dec表示十进制(默认)endl为换行符
eg:cout << oct << 16 << endl;
:: 作用域运算符
eg:std::cout,指的是cout来自于std这个名字空间
名字空间(namespace)
eg:using namespace std;
可直接使用cout << oct << 16 << endl;
而不用std::cout << oct << 16 << std::endl;
2.函数重载
定义:
1.同一个函数名能够完成不同的功能(一个函数名可能存在多种定义)
2.函数重载允许使用同一个函数名定义多个不同的函数,
3.编译的时候会根据实际传递给函数的参数数量,类型,顺序去匹配不同的函数
函数重载的条件:
1.在相同的作用域
2.函数名相同
3.参数列表不同(参数的数量,类型,顺序)
注意:要避免出现二义性
eg:int sum(int a=0,int b=0,int c = 0);
int sum(int a,int b);
====> sum(1,2);//产生二义性
编译器不知道是应该以(1,2,0)作为参数调用第一个函数还是以(1,2)调用第二个函数
换名机制:
eg:sum();
sum(int a);
sum(float);
使用 g++ -c X.cpp -o 1.o编译成二进制文件可以看到
例如:_Zsum
_Zsumi
_Zsumf
混合编程:告诉编译器,此函数的调用方法按照C语言的方式调用(不对函数进行换名)
eg:extern "C" void Func(int a[],int n);
表示Func函数使用C语言方式调用
内联函数(inline):
编译器在编译的时候,就会将该函数的函数体复制到函数的调用点
节省函数调用的开销,提高程序运行的效率
注意:内联函数不能太长
内联函数的基本思想是使用空间换取时间
3.面向对象编程
面向对象三个基本特征:
封装(Encapsulation):数据隐藏,升级和维护更加简单
继承(Inheritance):实现代码重用,提高开发效率
多态(Polymorphism):实现接口重用,一个相同的接口,可以实现多种功能
(抽象)
class类:
使用变量来描述对象的属性,称为成员变量
使用函数来描述对象的行为,称为成员函数
public:公有的
public修饰的成员(函数和变量),称为公有成员,在任何地方都可以直接访问
private:私有的
private修饰的成员(函数和变量),称为私有成员,只有本类的成员函数和友元函数才能访问
protected:保护的
protected修饰的成员(函数和变量),称为保护成员,只有本类的成员函数和友元函数和它的派生类才能访问(派生类就是“后代”的意思)
C++中struct和class的区别?
1.默认情况下,class中的成员都是私有的,struct是公有的;
2.class 这个关键字可以作为模板的参数,struct 这个关键字不行
注意:C 语言中 struct 可以实现封装,但是不可以继承,多态
C++中的class与C中的struct有什么区别?
1.C++的空结构体占一个字节的空间,C的空结构体不占空间
2.C++真正类型有无成员都占一字节C中的结构体不是真正的类型,空间大小有内部成员决定
4.构造函数与析构函数
构造函数:创建一个新的对象的时候一定会调用并且自动调用.
功能:专门用于对象的初始化工作,在类的对象创建时定义初始状态
特点:1.构造函数的名字和类名相同 类名()
2.构造函数没有返回值类型,也不能写void,可以有参数(可以重载),参数可以设置默认值
3.在创建对象的时候,自动调用,一定会调用,且只调用一次.不能通过已有对象手动调用构造函数
4.如果一个类中没有显示的声明构造函数,编译器会自动的生成一个构造函数,自动生成的构造函数函数体为空
类名(){}
当自定义构造函数时,编译器就不会自动生成。
调用重载析构函数:
eg:class Test
{
private:
int a;
public:
Test();
Test(int a);
};
Test t; //这是创建一个Test类型的对象,调用无参构造函数
Test t{100}; //这是创建一个Test类型的对象,调用有一个int参数的构造函数
注意:谨防二义性
构造函数的限制->不能被继承,不能说明为虚函数,不能显式调用,不能取构造函数的地址。
析构函数:
功能:专门用于对象的清理工作(例如:关闭文件,释放动态内存分配的空间....)
特点:
1.析构函数的名字和类名相似 ~类名
2.析构函数没有返回类型,且没有参数(不能设置默认值,不能重载)
3.在对象销毁的时候自动调用且一定调用
4.如果一个类中没有显示的声明析构函数,编译器会自动的生成一个空析构函数
~类名()
{}
在相同的作用域下面,先构造的对象,后析构
问题:
1.什么时候需要手动的写出构造函数和析构函数?
构造: 创建对象需要传参数
析构: 成员对象有指针对象,该指针对象指向一块堆空间的时候
2.如果构造函数的参数名与成员名相同,是否能够赋值成功
编译无错误
赋值: 局部名屏蔽成员名
3.当A类对象中拥有一个B类对象的时候,创建和销毁A类对象时,A和B的构造函数是如何调用的?
构造函数:
先调用B的构造函数,在调用A的构造函数
析构函数:
先调用A的析构函数,在调用B的析构函数
总结:如果一个类中有其他类的成员对象,先按照声明顺序依次调用成员对象的构造函数,最后在调用本类构造函数