C++入门到精通(2) (适合C入门后C++进阶)连载!连载!

😀永不放弃是你梦想实现的唯一秘诀 一起加油!!!

目录

🌹内联函数 

内联函数的特点

取代宏定义

🌹重载于默认值

🌷重载(重要)

🌷重载原理:

🌷默认参数

🌷参数占位符

🌷混合编程

🌹面向对象

🌷概述:

🌷类和对象(重点)

🌷访问权限:

🌷封装性(重要):


内联函数 

函数添加inline关键字 该函数为内联函数 本质还是一个函数

inline int getMax(int a,int b)  //内联函数
{
    return a>b?a:b;
}
void test_01()
{
    int a=10,b=20;
    cout<<getMax(a,b)<<endl;
}

内联函数的特点

内联函数:在编译阶段 像宏一样展开。有作用域的限制(可以放到命名空间,可以放到结构体和类中)

内联函数为了继承宏的效率,没有函数调用时的开销,然后又可以像普通函数那样,可以进行参数和返回值类型的安全检查,又可以作为成员函数

注意:任何在类内部定义的函数自动成为内联函数。

class A
{
public:
    func()  //自动转为内联函数
    {
    }
};

内联的条件:

不能存在任何形式的循环语句

不能存在过多的条件判断语句

函数体不能过于庞大

不能对函数进行取址操作

inline修饰函数 只是建议编译器 该函数为内联函数(由编译器决定)。

取代宏定义

宏函数的使用是在预处理阶段直接代码替换,所以,在使用上可能会出现数据异常;我们需要使用内联函数赖取代宏函数的应用。

#define ADD(x,y) x+y

inline int add(int x,int y)
{
    return x+y;
}

void test_01()
{
//    int res = ADD(10,20)*10;    //期望 300
//    cout<<res<<endl;    //实际 210    10+20*10;


    //使用内联函数就可以避免这种情况
    int res = add(10,20)*10;
    cout<<res<<endl;        //300
}

内联函数和宏定义总结:

内联函数比宏函数安全性更高 有参数类型和返回值类型检测 又可以作为成员函数

重载于默认值

重载(重要)

重载条件:在同一个作用域下 函数名相同 参数个数或类型不同作用 统一功能的使用

 例子:

void func(int a)
{
    cout<<"一个int值的参数"<<endl;
}
void func(int a,int b)
{
    cout<<"两个int值的参数"<<endl;
}
void func(float a,float b)
{
    cout<<"两个float值的参数"<<endl;
}
void test_01()
{
    int a=0,b=0;
    func(a);        //一个int值的参数
    func(a,b);      //两个int值的参数
    float c=0,d=0;
    func(c,d);      //两个float值的参数
}

重载原理:

代码编译时,在系统中存储的为函数名字加一定形式参数集合

例如:

void add(int a,int b) -----> #addII

int sub(float a) -----> #subf

以上案例只是为了便于理解 实际存储方式以手册为准

所以 函数的返回值不同不会够成重载 编译器无法识别返回值不同的函数重载

默认参数

可以给函数的形参添加默认值,函数调用传参时 当参数没有被赋值时 默认使用默认参数

默认参数可以写到函数声明或函数实现中 其一即可 (不可两个都写 一般写到函数的声明中)

 int func(int a = 3);    //函数声明
 
void test_01()
{
    int ret = func(); //无参调用 函数形参使用默认参数
    cout<<ret<<endl;    //3
}

int func(int a)    //函数定义
{
    cout<<a<<endl;  //3
    return a;    //返回默认值
}

当一个参数有默认值后 该参数右边的所有形参必须都有默认值。

参数占位符

占位符:只写类型,不给定变量名;占位符很少用;一般再后面的运算符重载中使用

void func(int)  //占位符
{
    cout<<"占位符函数"<<endl;
}

void test_01()
{
    func(a);
}

参数占位符也可以有默认值 (当给参数占位符默认值后 参数占位符毫无作用)

注意:默认参数和占位参数建议不要在函数重载中使用 容易发生二义性

混合编程

混合编程;在C++的代码中嵌入C的代码; 或者C的代码中嵌入C++代码;需要考虑如何兼容的问题

test.h 代码

#ifndef TEST_H
#define TEST_H


#ifdef __cplusplus   //如果为C++代码 则会执行extern
extern "C"{    //嵌入c代码的规则
#endif
int myadd(int a,int b);
int mysub(int a,int b);
#ifdef __cplusplus
}
#endif
#endif // TEST_H

test.c 代码

int myadd(int a,int b)
{
    return a+b;
}
int mysub(int a,int b)
{
    return a-b;
}

main.cpp 代码

#include "test.h"
void test01()
{
    cout<<add(10,5)<<endl;
    cout<<sub(10,5)<<endl;
}

面向对象

概述:
 

面向对象与面向过程思想:

生活案例:

面向过程:只关注完成的结果,不关注是谁完成的;例如:开饭店-老板既是初始又是服务员又是收银员

面向对象:由专业对象完成某件事; 例如:开饭店-招厨师、招服务员、招收银员。

程序案例:

面向过程:从main函数出发,直接执行代码: 例如, int age = 10;

面向对象:从main函数出发,先创建对象,再执行代码: 例如, Person zs; zs.age=10;

类和对象(重点)

面向对象:模拟现实世界,解决现实问题的一种贴近生活化的编程思维。

类:一类事物的抽象化描述(集合) 例如: 人类 水果类 动物类等等

对象:一类事物中的具体化的某个个体 例如:张三 香蕉 猴子

成员属性:描述某个对象的特征,以名词形式出现 例如:张三有姓名,年龄

成员函数:描述某个对象的行为,以动词形式出现 例如:张三能吃

面向对象设计:创建一个类,类中有属性和函数,创建对象,通过对象调属性和函数

案例:张三很能吃 类-学生类 对象-张三 属性-姓名,年龄 函数-吃

#include <cstring>
class Student
{
public: //公共权限
    char name[32];
    int age;
    void func()
    {
        cout<<name<<"很能吃"<<endl;
    }
};

void test_01()
{
    Student s;
    s.age = 18;
    strcpy(s.name,"zansan");    //zansan很能吃
    s.func();
}

访问权限:

public :公共权限 在类外类内都可访问

private:私有权限 在类内可访问 类外不可访问

protected:保护权限 在类内可访问 类外不可访问(和权限的区别会在后面课程继承中展示)

封装性(重要):

概述:类成员变量私有化 不允许外界直接访问 通过接口访问

作用:提高安全性和复用性

class Girl
{
private:
    int m_Age;
public:
    void setAge(int age)    //int age = 18
    {                       //可添加年龄的判断条件
        m_Age = age;     //注意:成员属性和参数名不能重名
    }
    int getAge()
    {
        return m_Age;
    }
};

void test_01()
{
    Girl xl;
    xl.setAge(18);
    cout<<xl.getAge()<<endl;
    //cout<<xl.m_Age<<endl;   //ERROR 为私有属性
}

练习:

请设计一个 Person 类,Person 类具有 name 和 age 属性,提供初始化函数 (Init),并提供对 name 和 age 的读写函数(set,get),但必须确保 age 的赋值在有 效范围内(0-100),超出有效范围,则拒绝赋值,并提供方法输出姓名和年龄.(尽量先自主完成哟)

#include <string.h>
class Person
{
private:
    char m_Name[32];
    int m_Age;
public:

    void setname(char* name)
    {
        strcpy(m_Name,name);
    }
    char* getname()
    {
        return m_Name;
    }
    void setage(int age)
    {
        if(age>=0&&age<=100)
        {
            m_Age = age;
        }
        else
        {
            cout<<"输入年龄错误!!!"<<endl;
        }
    }
    int getage()
    {
        return m_Age;
    }
    void InitPerson(char* name,int age)
    {
        strcpy(m_Name,name);
        setage(age);


    }


    void printPerson()
    {
        cout<<"姓名 :"<<m_Name<<"年龄 :"<<m_Age<<endl;
    }
};


void test_01()
{
    Person p1;
    p1.InitPerson("zhangsan",18);
    p1.printPerson();
    Person p2;
    p2.setname("lisi");
    p2.setage(20);
    cout<<"姓名 :"<<p2.getname()<<"  年龄 : "<<p2.getage()<<endl;
}

进阶练习可以去牛客网啦

建议收藏 c++连载(入门到精通)🌹🌹🌹

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值