C++就是在C的基础上加了很多东西。有C基础,学C++就不是难事;有java基础,学C++就非常好理解;同时有C和java基础......学C++那就是一天的事。但是学精就不是说说这么简单了,什么都怕专业嘛~
这篇博客旨在整理(有C基础的前提下)学习C++要注意的知识。希望对大家有所帮助。
一、程序基础
1、c++的头文件就不一样,它是#include<iostream>。还要有命名空间,为using namespace std; std为标准流的命名空间,没这句cout、cin就用不了。
2、变量可以以下划线开头,但通常多用作外部连接。标点和符号都不可以出现在标识中。数字不可以开头。大小写敏感。
3、bool类型是C语言所没有的。wchar_t是宽字符,存储两个字节的字符。
4、变量默认为signed,若要声明无符号变量可以声明,如: unsigned int num
5、输入:cin >>str 只能读取一个单词,一旦碰到任何空格,读取操作就会停止。想要输入一行可以调用 getline(cin,str) 或 cin.getline(buff,SIZE) 。str为string类型,buff 为字符数组长度为SIZE。
6、输出: cout << "Hello, I am " << age << " years old and my name is " << name<<endl; 换行为endl
二、函数
1、函数传地址 void swap(int& a, int& b) 调用时swap(a,b)即可交换
2、有默认参数的函数 int abc (int a, int b=2) 调用时可以写abc(a),则b为2。也可以写abc(a,b)。
3、函数的重载 int divide (int a, int b) 与 float divide (float a, float b) 即为函数的重载,变量类型不同,调用函数不同。
4、内联函数 在函数前面加上inline。相当于宏定义,编译时替换代码
三、类和对象
1、类(class)是一种将数据和函数组织在同一个结构里的逻辑方法。定义类的关键字为class ,其功能与C语言中的struct类似,不同之处是class可以包含函数,而不像struct只能包含数据元素。如果我们在定义一个class成员的时候没有声明其允许范围,这些成员将被默认为private范围。
2、成员函数的实现:范围操作符 (::) 声明了被定义的成员所属的class名称。如 void myClass::set_values (int a, int b)
3、构造函数 它可以通过声明一个与class同名的函数来定义。当且仅当声明一个新的对象,或给该class的一个对象分配内存的时候,这个构造函数将自动被调用。构造函数的原型和实现中都没有返回值(return value),也没有void 类型声明。析构函数必须与class同名,加水波号tilde (~) 前缀,必须无返回值。如:~myClass();
4、指向函数的指针,对象的声明,变量的声明
#include<iostream> using namespace std; class gaga{ public : gaga(){ cout<<"heihei"<<endl; } }; class haha{ public : gaga a; haha(){ cout<<"haha"<<endl; } }; int main(){ gaga g; cout<<"------------"<<endl; gaga *p =new gaga(); cout<<"------------"<<endl; haha ha; }
运行输出为:
[fsy@localhost cpp]$ ./TestConstruct heihei ------------ heihei ------------ heihei haha [fsy@localhost cpp]$
5、操作符重载
#include<iostream> using namespace std; class A{ int a; public: A(int t){a=t;} A operator + (A); int display(){return a;} }; A A::operator + (A t){ A temp(0); temp.a=a+t.a; return temp; }; int main(){ A a(3); A *b = new A(4); a=a+*b; cout<<a.display()<<endl; }
运行输出为: 7
6、关键字this 通常被用在一个class内部,指正在被执行的该class的对象(object)在内存中的地址。它是一个指针,其值永远是自身对象的地址。
7、静态变量static 是class的静态数据成员。它们的内容不依赖于某个对象,对同一个class的所有对象具有相同的值。
8、友元函数、友元类 通过添加带有friend修饰的函数声明,可以允许一个外部函数获得访问class的protected 和 private 成员的能力。个人不太喜欢,破坏了封装性。友元类用法一样
9、继承 子类继承父类的public 和 protected。写法 class B :public A{...}; 其中public表示继承类型保持不变。protected则将所有属性改为protected。
10、子类不能访问父类的private。不能继承父类的构造函数和析构函数、 operator=() 成员 和 friends 。构造顺序是 父类->子类。析构顺序是 子类->父类。
11、多继承 一个类可以有多个父类写法为class A:public B,public C
12、多态 父类指针指向一个子类对象,可以调用子类的重写的虚方法。
#include<iostream> using namespace std; class A{ int a; public: int fun(){return 1;} virtual int foo(){ return 2;} //virtual int foo()=0; //这么写为纯虚函数,类为虚基类。不可以声明虚基类类的对象 }; class B :public A{ public : int fun(){ return 3;} int foo(){ return 4;} }; int main(){ A *p = new A(); A *q = new B(); cout<<p->fun()<<endl; cout<<p->foo()<<endl; cout<<q->fun()<<endl; cout<<q->foo()<<endl; }
运行输出结果为:1 2 1 4