1、基本概念
1 – 什么是C++
c++就是c语言的扩展,完全兼容c语言
c++语言在c语言的基础上添加了面向对象编程和泛型编程的支持。c++继承了c语言高效,简洁,快速和可移植的传统。
c++融合了3种不同的编程方式:
c语言代表的过程性语言.
c++在c语言基础上添加的类代表的面向对象语言.
c++模板支持的泛型编程。
c语言和c++语言的关系:
c++语言是在C语言的基础上,添加了面向对象、模板等现代程序设计语言的特性而发展起来的。两者无论是从语法规则上,还是从运算符的数量和使用上,都非常相似,所以我们常常将这两门语言统称为“C/C++”。
C语言和C++并不是对立的竞争关系:
1.C++是C语言的加强
2.C++是以C语言为基础的,并且完全兼容C语言的特性。
2 – 面向对象的编程(类、对象)
c语言是面向过程的编程,所以写代码时主要在逻辑之前需要考虑每一个功能的实现
c++语言是面向对象的编程,所以很多基础功能别人都已经封装好,程序员只需要写逻辑即可,大大减少了基本语言的编写,使的编程变得高效简单
说道面向对象的语言,离不开类和对象
类:类似于结构体,可以理解为是一种构造数据类型,只不过类可以进行封装(可以在类中定义函数等等)
对象:类似一个结构体变量,通过这个对象,可以访问类中的成员
3 – c++三要素(封装、继承和多态)
封装:c语言中的结构体中只能定义数据类型(基本数据类型和构造数据类型),但是不能定义函数,而c++语言可以定义函数,这个地方就体现出了封装性
继承:可以将一个类中的成员继承给另一个类,并且两个类独立,这样大大减少了相同代码的编写,是的代码的可重用性增加
多态:在c语言中用一个代码中不能出现相同的函数名,例如求和,如果类型不同则需要编写不同的函数,但是在c++语言中可以在一个代码中利用一个函数名编写不同参数的函数
函数重载、虚函数
3 – c++三要素(封装、继承和多态)
封装:c语言中的结构体中只能定义数据类型(基本数据类型和构造数据类型),但是不能定义函数,而c++语言可以定义函数,这个地方就体现出了封装性
继承:可以将一个类中的成员继承给另一个类,并且两个类独立,这样大大减少了相同代码的编写,是的代码的可重用性增加
多态:在c语言中用一个代码中不能出现相同的函数名,例如求和,如果类型不同则需要编写不同的函数,但是在c++语言中可以在一个代码中利用一个函数名编写不同参数的函数
函数重载、虚函数
2、第一个代码
1 – 在终端输出hello world
2 – QT中代码的编写
(1)安装QT
直接下载软件包安装即可,注意要使用英文路径
(2)创建c++工程
选择文件–>点击创建文件或者项目–>选择Non-Qt Project–>选择c++点击确定–>设置项目名称和保存路径(必须是英文名字和英文路径)
(3)修改qt编码格式
由于qt是安装在windows环境下的,所以需要修改为windows能够识别的编码格式
工具–>选项–>文本编辑器–>行为–>在文件编码中选择GB2312或者GBK就可以了
3 – 代码基本的解释
//#include:预处理指令,用来包含头文件
//iostream:有点类似stdio.h,保存了与标准输入输出相关的一些信息
#include <iostream>
//使用名为std的命名空间
//std:本质是一个命名空间,里面保存了标准输入输出的类的对象
using namespace std;
int main(int argc, char *argv[])
{
//cout:标准输出,类似printf
//endl:用于换行
//<<:用于连接要输出的内容
cout << "Hello World!" << endl;
cout << "nihao beijing" << endl << "welcome to qf" << endl;
cout << "你好, 北京" << endl;
return 0;
}
3、域解析符(作用域运算符) – ::
#include <iostream>
using namespace std;
int a = 100;
int main(int argc, char *argv[])
{
cout << "a = " << a << endl;
int a = 888;
cout << "a = " << a << endl;
//域解析符:主要用于在函数中调用全局定义的变量或者命名空间等等
//作用域运算符可以用来解决局部变量与全局变量的重名问题
cout << "a = " << ::a << endl;
return 0;
}
执行结果
4、命名空间
#include <iostream>
using namespace std;
//定义命名空间
//命名空间的目的就是为了方便多人编程时出现相同的全局变量或者函数名而造成不知道调用哪一个的问题
namespace zhangsan {
int a = 666;
void myprint()
{
cout << "My name is zhangsan" << endl;
}
}
namespace lisi {
int a = 888;
void myprint()
{
cout << "My name is lisi" << endl;
}
}
void test1()
{
//命名空间中的成员需要用过命名空间后加域解析符进行访问
cout << "a = " << zhangsan::a << endl;
cout << "a = " << lisi::a << endl;
zhangsan::myprint();
lisi::myprint();
}
void test2()
{
cout << "a = " << zhangsan::a << endl;
cout << "a = " << lisi::a << endl;
//使用如下形式可以在当前函数中使用指定变量时不需要通过命名空间来获取
using zhangsan::a;
using zhangsan::myprint;
cout << "a = " << a << endl;
myprint();
}
void test3()
{
cout << "a = " << zhangsan::a << endl;
cout << "a = " << lisi::a << endl;
//当前形式是使用名为zhangsan的命名空间,所以下面内容就可以直接使用zhangsan中的所有成员
using namespace zhangsan;
cout << "a = " << a << endl;
myprint();
}
//匿名命名空间:没有名字的命名空间,只能在当前代码中使用,不能再其他代码中调用,类似被static修饰的变量或者函数
namespace{
int a = 100;
int b = 200;
}
void test4()
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
//给命名空间取别名
void test5()
{
cout << "a = " << zhangsan::a << endl;
namespace wangwu = zhangsan;
cout << "a = " << wangwu::a << endl;
}
int main(int argc, char *argv[])
{
test3();
return 0;
}
5、标准输入和标准输出
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
//cout:标准输出,实际是一个类的对象
cout << "Hello World!" << endl;
cout << "你好 北京" << "hello 北京" << endl;
int a = 100;
cout << a << endl;
char str[] = "hello world";
cout << str << endl;
//cin:标准输入,实际也是一个类的对象
//注意:默认在qt中不能进行标准输入,需要调出命令终端
//在左侧的菜单栏中选择项目-->选择Build&Run中的Run-->在运行位置有一个Run inteminal打钩即可
//int num;
//cin >> num;
//cout << "num = " << num << endl;
int num1, num2;
cin >> num1 >> num2;
cout << num1 << " " << num2 << endl;
return 0;
}
6、C++和C语言中结构体的区别
1 – C语言中的结构体
#include <stdio.h>
struct China{
char name[32];
//C语言中结构体是不能包含函数的,只能包含基本数据类型和构造类型的成员
// void myfun()
// {
// printf("hello world\n");
// }
};
struct Foreigner{
char name[32];
};
void China_speak(struct China *a)
{
printf("%s是一个中国人\n", a->name);
}
void Foreigner_speak(struct Foreigner *b)
{
printf("%s is foreigner\n", b->name);
}
void test1()
{
//在C语言中定义结构体变量必须加struct,否则报错
struct China a = {"张三"};
China_speak(&a);
struct Foreigner b = {"lucy"};
Foreigner_speak(&b);
//由于c语言没有封装性,所以函数调用时可能会出现歧义
China_speak(&b);
}
int main(int argc, char *argv[])
{
test1();
return 0;
}
2 – C++中的结构体
#include <iostream>
using namespace std;
struct China{
char name[32];
//c++结构体具有封装性,所以可以在里面定义函数
void speak()
{
printf("%s是一个中国人\n", name);
}
};
struct Foreigner{
char name[32];
void speak()
{
printf("%s is foreigner\n", name);
}
};
void test1()
{
//C++中定义结构体变量时可以不加struct
China a = {"张三"};
a.speak();
Foreigner b = {"lucy"};
b.speak();
}
int main(int argc, char *argv[])
{
test1();
return 0;
}
7、函数重载
#include <iostream>
using namespace std;
//函数重载
//在C++中,在同一个代码里面只要保证参数的个数或者参数的类型不同,可以使用相同的函数名
int MyAdd(int a, int b)
{
cout << "1" << endl;
return a + b;
}
float MyAdd(float a, float b)
{
cout << "2" << endl;
return a + b;
}
void MyAdd()
{
cout << "3" << endl;
printf("hello world\n");
}
int MyAdd(int a)
{
cout << "4" << endl;
return a;
}
//注意:函数重载时不能只以函数的返回值作为函数重载的条件
//int MyAdd()
//{
// cout << "5" << endl;
// int a = 888;
// return a;
//}
void test1()
{
cout << MyAdd(10, 20) << endl;
//如果带小数的默认是double类型,如果是float类型,需要加f
cout << MyAdd(10.123245632323452f, 20.452234523453452f) << endl;
MyAdd();
cout << MyAdd(10) << endl;
}
//注意:如果函数重载和缺省参数一起使用时,一定注意二义性
void myfun(int a, int b, int c = 100)
{
cout << a << " " << b << " " << c << endl;
}
void myfun(int a, int b)
{
cout << a << " " << b << endl;
}
void test2()
{
myfun(10, 20, 30);
//myfun(10, 20);
}
int main(int argc, char *argv[])
{
test1();
return 0;
}