目录
1.C和C++的区别
C是面向过程开发:
- 自己做饭
- 自己洗衣服
- 自己扫地
C++面向对象开发:
找个对象让Ta来做
C语言是把事情分条目,一步步来做。可以清楚的把握细节。
这种方式符合计算机的思维,特点:执行效率高 开发效率
C++语言调用不同的对象来完成工作。符合人的思维。
特点:运行效率比C语言稍低,但是开发效率高
C语言核心是怎么来做 C++核心是找找谁来做
2.开发工具使用
2.1 设置编码
然后重启
2.2 新建项目步骤
下一步完成完成创建
2.3 运行
点击按钮或者Ctrl+R
配置文件中加入c++11支持
QMAKE_CXXFLAGS += -std=c++11
3.第一个程序
#include <iostream> //输入和输出头文件
using namespace std; //使用std命名空间 可以使用std里面的内容
int main()
{
cout << "Hello 你好!" << endl; //cout用来输出 end:end line 结束行
int a=10;
cout<<a<<endl;
char ch='a';
cout<<ch<<endl;
return 0;
}
4.引用
4.1 概念
引用的作用是给变量起一个别名。操作引用就相当于操作变量
引用类型和变量类型保持一致
#include <iostream> //输入和输出头文件
using namespace std; //使用std命名空间
int main()
{
int a=10;
int& small_a=a; //创建一个int类型的引用
cout<<a<<" "<<small_a<<endl; //双引号之间内容会原样输出
cout<<&a<<" "<<&small_a<<endl;//0x61fe88 0x61fe88
}
引用的性质
性质1
当成为一个变量的引用之后,就不能成为其他变量的引用
了解内容:
引用实质是个特殊的指针。 指针常量
int& small_a=a;
相当于 int * const small=&a; const修饰small,所以存的地址不可以更改
#include <iostream> //输入和输出头文件
using namespace std; //使用std命名空间
int main()
{
int a=10;
int& small_a=a;
cout<<&a<<" "<<&small_a<<endl;
int b=20;
small_a=b; //把b的值 给了small_a 所以a的值一起变化
cout<<a<<" "<<small_a<<endl;
cout<<&a<<" "<<&small_a<<endl;
//&small_a=b; //small_a不允许成为b的引用
}
性质2
引用必须初始化,并且不能为NULL
#include <iostream> //输入和输出头文件
using namespace std; //使用std命名空间
int main()
{
//int & a; //错误:没有初始化
//int & a= NULL; //不能用NULL
}
性质3
当作为纯数字引用时,引用需要加const修饰。代表其指向的数值不可更改
#include <iostream> //输入和输出头文件
using namespace std; //使用std命名空间
int main()
{
//int & a=100; //错误
const int & a=100;
}
性质4
const修饰的引用不可以直接更改变量的值,但是变量的值更改之后,可以改变引用的值。
如果引用做为函数参数,可以提高传递效率。但是这时可以更改实参的值,如果只是访问,这时需要加const修饰引用
#include <iostream> //输入和输出头文件
using namespace std; //使用std命名空间
int main()
{
int a=10;
const int& b=a;
//b++; 错误:只读 不允许更改值
a++;
cout<<a<<" "<<b<<endl; //11 11
}
引用的应用
代替c语言中的指针传地址
传值:函数形参只是实参的拷贝,形参改变,不会影响实参的值
传引用:引用做参数的好处是不需要为形参开辟内存空间 ,也不需要为其赋值。提高了传递效率。可以直接操作实参
#include <iostream>
using namespace std;
void mySwap(int a,int b){
int t;
t=a;
a=b;
b=t;
}
void mySwap2(int * a,int *b){
int t;
t=*a;
*a=*b;
*b=t;
}
void mySwap3(int& a,int& b){
int t;
t=a;
a=b;
b=t;
}
int main()
{
int m=10,n=20;
mySwap(m,n);
cout<<m<<" "<<n<<endl; //10 20
mySwap2(&m,&n);
cout<<m<<" "<<n<<endl; //20 10
mySwap3(m,n);
cout<<m<<" "<<n<<endl; //10 20
}
5.string字符串
c++中string类中用于储存字符串的类。里面内置了很多处理字符串的方法。替代c语言中的字符数组
at取元素方式更安全
#include <iostream>
using namespace std;
int main()
{
string s="hello"; //给字符串s赋值
for(int i=0;i<s.size();i++){
cout<<s[i]<<" ";
}
cout<<endl;
//c++11中引入for each
for(char ch:s)
{
cout<<ch<<" ";
}
cout<<endl;
cout<<s[0]<<endl; //h
cout<<s.at(0)<<endl; //h 这种方式更安全
cout<<s[5]<<endl; //超出下标范围没有报错
cout<<s.at(5)<<endl; //'std::out_of_range 报出超出范围错误
}
6.函数提高
6.1 内联函数
内联函数只取代c语言中宏定义。内联函数可以提高程序的运行效率,编译的时候,会把函数体的内容展到调用位置,节省了函数调用的时间,
使用条件:
- 函数代码少(5行以下)
- 函数运行时间短
- 调用次数频繁
#include <iostream>
using namespace std;
inline void show(){
cout<<"hello"<<endl;
}
int main()
{
show(); //相当于直接在这里写 cout<<"hello"<<endl;
}
6.2 函数默认值
函数允许有默认值,当不传参数时,使用默认值。如果传入参数,会用传入的参数替代默认值
默认值会提高程序的灵活性
#include <iostream>
using namespace std;
void draw(string color="黑色"){
cout<<"画笔颜色"<<color<<endl;
}
int main()
{
draw(); //画笔颜色黑色
draw("红色"); //画笔颜色红色
}
函数默认值的注意事项
- 函数的声明和定义分离的时候,默认值只需加在声明处
#include <iostream>
using namespace std;
void draw(string color="黑色"); //只在声明处写默认值
int main()
{
draw(); //画笔颜色黑色
draw("红色"); //画笔颜色红色
}
void draw(string color) //定义
{
cout<<"画笔颜色"<<color<<endl;
}
- 当函数有多个参数时,中间有一个参数有默认值,其后的的参数都需要有默认值
#include <iostream>
using namespace std;
//下方错误 b有默认值 其后的参数也需要有默认值
//void func(int a,int b=10,int c){
// cout<<a<<" "<<b<<" "<<c<<endl;
//}
void func(int a,int b=10,int c=20){
cout<<a<<" "<<b<<" "<<c<<endl;
}
int main()
{
func(0);
func(1,2);
}
练习1:编写一个message函数
参数有 年龄age ,姓名 name , 地址 address。 年龄默认是18 地址默认“山东"。函数输出以上参数信息
#include <iostream>
using namespace std;
void message(string name,int age=18,string address="山东"){
cout<<name<<" "<<age<<" "<<address;
}
int main()
{
message("小明");
}
练习2:写一个repeat(重复)函数,函数中有两个参数,一个是代表重复次数的n,另一个是代表输出的字符串。
比如调用 repeat(5,"hello") 会打印5行 helle
如果调用repeat(10);这时会打印10行的"OK"
#include <iostream>
using namespace std;
void repeat(int n,string str="OK")
{
for(int i=1;i<=n;i++){
cout<<str<<endl;
}
}
int main()
{
repeat(10);
repeat(0,"hello");
}
函数重载
程序中允许函数同名处理相同或者相似的问题。但是需要参数列表需要不同,需要参数的个数不同或者参数的类型不同。但是不能通过返回值不同进行区分函数重载
#include <iostream>
using namespace std;
void show(int a){
cout<<a<<endl;
}
void show(int a,int b){
cout<<a<<" "<<b<<endl;
}
void show(string str){
cout<<str<<endl;
}
//不能通过返回值不同区分函数重载
//string show(string str){
// return str;
//}
int main()
{
show(50);
show(30,40);
show("world");
}
函数重载的注意事项:
函数重载不能和函数默认值连用,会产生二义性
#include <iostream>
using namespace std;
void show(int a){
cout<<a<<endl;
}
void show(int a,int b=100){
cout<<a<<" "<<b<<endl;
}
void show(string str){
cout<<str<<endl;
}
int main()
{
show(50);
show(30,40);
show("world");
}
练习:
写一个计算工资的函数getSalary. 普通文员工资就是基本工资base_salary. 销售的工资包括基本工资base_salary和奖金bonus 函数重载形式给出这两个函数
#include <iostream>
using namespace std;
void getSalary(double base_salary)
{
cout<<"文员的工资"<<base_salary<<endl;
}
void getSalary(double base_salary,double bonus)
{
cout<<"销售的工资"<<base_salary+bonus<<endl;
}
int main()
{
getSalary(5000);
getSalary(5000,1000);
}
7.面向对象的基础
面向对象的三大特征:封装,继承,多态
类与对象
类的定义:把同一类事物的共同特征抽取出来就是类,类只是一个抽象的概念
对象:由类创建的具体实体叫做对象
类中包括属性和行为
属性用来描述类是什么样的 一般都是些名称
行为是描述类可以做什么 一般都是动词
人类 属性: 姓名 年龄 性别
行为: 吃东西 学习 走
手机类 属性:品牌 型号 配置 价格
行为: 发短信 播放音乐 播放视频 通讯
属性又称成员变量 或者数据成员
行为又称成员函数 或者成员方法
成员变量和成员函数都是类的成员
栈内存对象 :通过点的方式调用成员。出了作用范围(所在花括号执行完)自动销毁
堆内存对象: 需要用new关键字创建。调用方式需要用->的方式。需要手动销毁。销毁时使用关键字delete,并且对象指针赋值为NULL,如果不销毁内存会被持续占用,造成内存泄漏
由类创建对象的过程叫类的实例化
#include <iostream>
using namespace std;
class MobliePhone{
public: //公共属性
string brand; //品牌
string model;// 型号
int price; //价格
void play_music(){
cout<<"《只因你太美》"<<endl;
}
void play_video(){
cout<<"《狂飙》"<<endl;
}
void show(){
cout<<"品牌:"<<brand<<"型号:"<<model<<" 价格:"<<price<<endl;
}
}; //末尾分号
int main()
{
MobliePhone mp1; //栈内存对象 通过点的方式调用成员
mp1.brand="华为";
mp1.model="P60";
mp1.price=6000;
mp1.play_music();
mp1.play_video();
mp1.show();
MobliePhone mp2;
mp2.show(); //品牌:型号:价格92 属性不赋值string类型默认为空 int类型为随机值
//堆内存对象 需要用new关键字创建。
MobliePhone * mp3=new MobliePhone; //mp3存储对象的首地址
mp3->brand="红米";
mp3->model="10pro";
mp3->price=2000;
mp3->play_music();
mp3->play_video();
mp3->show();
delete mp3;
mpe=NULL;
}