学习背景,大一的时候学过c++,但是后面基本没用过了,一直写得是c++,最近在实习用的是c++,所以需要重新开始学。
最简单的helloworld
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
C++简介
C++ 和Java一样完全支持面向对象的程序设计,包括面向对象开发的四大特性:封装,抽象,继承,多态
c++跟java最简单的不同就是,c++需要先编译链接后生成二进制文件,然后才能运行,
相应的,因为java有虚拟机的存在,一般都是直接运行,一边编译一边运行
c++对应的编译器常见的gcc,g++等。
所以我们创建一个helloworld.cpp文件输入helloworld的代码的话,我们要把这个程序运行起来需要进行以下步骤
$ g++ hello.cpp // 会输出一个编译文件
$ ./a.out //执行程序
Hello World
C++的类型
1.基本类型
c++中有七种基本类型int, float, double, char, bool, void, wchar_t
与java不同的是,没有了long,short类型,多了wchar_t宽字符类型,因为char表示的范围为8位字符类型,但是除了英文外其他语言的类型不止256种,那么这个时候char就不够表示了,这个时候就可以用wchar_t表示
除此之外,一些基本类型,比如int,float,double可以用
一些基本类型可以使用一个或多个类型修饰符进行修饰:signed,unsigned,short,long修饰,类型java中的long其实在c++中就是用long int表示,short就是用short int表示
2.typedef
可以用typedef给已有的类型取一个其他的名字,比如我们觉得int不好,我们改一个Integer
typedef int Integer
3.枚举类型
#include<iostream>
using namespace std;
enum color{
green,
blue,
red
};
int main(){
cout << "hello world!" <<endl;
color c = green;
cout << c << endl; // 0
return 0;
}
枚举类型的默认值是从0开始的,后面依次加1
4.全局变量和局部变量
在c++中局部变量会覆盖掉全局变量(如果名称一样的话)
除此之外不同的是,在局部变量中如果未初始化变量的话,那么变量就为空,如果是全局变量的话系统会给变量赋默认值,比如int给0的赋值
5.常量类型
85 // 十进制
0213 // 八进制
0x4b // 十六进制
30 // 整数
30u // 无符号整数
30l // 长整数
30ul // 无符号长整数
string greeting = "hello, runoob"; //字符串常量
// define预处理,可以预先赋值给一些名称一定的值,作为全局常量
#define LENGTH 10
#define WIDTH 5
#define NEWLINE '\n'
const int LENGTH = 10; //跟java的const差不多
6.存储类
auto存储类:类似常用的var类型,可以自动判定变量的类型
auto f = 3.14 //double
register存储类 :用于定义存储在寄存器中而不是RAM的局部变量,这意味着最大尺寸等于寄存器的大小(通常是一个词)
static存储类:跟java的static差不多,如果一个类中有static定义的变量,那么所有实例都会对该变量进行共享
extern存储类:当前文件内的全局变量用extern修饰的话别的文件也可以访问
mutable,thread_local存储类
C++的基本语法
c++的循环,if判断,函数组成基本和Java一致
数组的申明:
double test[5];
// init
double test1[2] = {1.0, 2.0};
C++中的指针
Java中是没有指针的,因为所有的引用都是指针,如果要值传递需要使用深拷贝。
而c++中有指针就可以区分值传递和引用。
int var = 20;
int *ip;
ip = &var; //获取var的地址传给ip指针
cout << ip <<endl; // 输出地址
cout << *ip <<endl;// 输出取值
在C++中与指针相似的还有一个引用
他和指针的功能基本相同,有三个不同的地方:
1.不存在空引用,指针可以为空
2.引用初始化的时候一定要赋值,而指针可以不用
3.引用赋值之后就不可改变,指针可以
int i;
double d;
int& r = i;
double& s = d;
C++的输入输出
char name[50];
cout << "请输入您的名称: ";
cin >> name;
cout << "您的名称是: " << name << endl;
C++的结构体
C++的面向对象
C++的类和结构体
c++中有跟java一样的类class,一般Java中一个文件就是一个类,但是c++不一定,
我们可以创建一个main.cpp文件放入以下代码,我们可以简单的看出C++中的类与Java的区别
class Boy{
public:
string name;
int age;
// 成员函数
// 可以在类内部进行实现
string getSalary(){return salary};
// 也可以放在外部一起实现
void setSalary(double sal);
private:
double salary;
}
class Girl{
public:
string name;
int age;
// 成员函数
// 可以在类内部进行实现
string getSalary(){return salary};
// 也可以放在外部一起实现
void setSalary(double sal);
private:
double salary;
}
double Boy::setSalary(double salary){
this->salary = salary;
}
double Girl::setSalary(double sal){
salary = sal;
}
int main(){
return 0;
}
与类相同的还有结构体struct,简化版的类
typedef struct Books
{
string title;
string author;
string subject;
int book_id;
}Books;
Books book;
books.title = "boo1";
cout << books.title << endl;
C++类的继承
// 基类
class Animal {
// eat() 函数
// sleep() 函数
};
//派生类
class Dog : public Animal {
// bark() 函数
};
public表示继承的类型,这个类型表示了基类的成员在派生类中的相应的修饰符:
公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。
私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。
与java不同的是,在C++中可以继承多个父类
class A: public B, public C{}
C++中的函数重载和多态
在同一个作用域内,可以申明几个功能类似的同名函数,但这些同名函数的传参必须不同,一般指参数的个数,类型或者顺序。
这个与Java类似。
class printData
{
public:
void print(int i) {
cout << "整数为: " << i << endl;
}
void print(double f) {
cout << "浮点数为: " << f << endl;
}
void print(char c[]) {
cout << "字符串为: " << c << endl;
}
};
多态其实跟函数覆写类似,就是在类的继承关系基础上,对父类的一些函数进行覆写
class A{
public:
// 只有虚函数才能被覆写
virtual void print(){
cout << "A" << endl;
}
}
class B: public A{
public:
void print(){
cout << "B" << endl;
}
}