1-C++中C语言和C++区别、引用、string字符串、内联函数及函数默认值的基础知识

1.C和C++的区别

C是面向过程开发:

  1. 自己做饭
  2. 自己洗衣服
  3. 自己扫地

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语言中宏定义。内联函数可以提高程序的运行效率,编译的时候,会把函数体的内容展到调用位置,节省了函数调用的时间,

使用条件:

  1. 函数代码少(5行以下)
  2. 函数运行时间短
  3. 调用次数频繁

#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("红色"); //画笔颜色红色
}

函数默认值的注意事项

  1. 函数的声明和定义分离的时候,默认值只需加在声明处

#include <iostream>
using namespace std;
void draw(string color="黑色"); //只在声明处写默认值

int main()
{
   draw();  //画笔颜色黑色
   draw("红色"); //画笔颜色红色
}

void draw(string color)  //定义
{
    cout<<"画笔颜色"<<color<<endl;
}

  1. 当函数有多个参数时,中间有一个参数有默认值,其后的的参数都需要有默认值

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值