第二章 C++概述

/*
 1.const修饰符用法
 2.内联函数
 3.带默认参数的函数
 4.函数的重载
 5.作用域运算符::
 6.共用体
 7.运算符new和delete
 8.引用
 9.应用举例
 */
#include <iostream>
#include <cmath>
using namespace std;
void testFun1();
void testFun2();
void testFun3();
void testFun4();
void testFun5();
void testFun6();
void testFun7();
void testFun8();
void testFun9();
int main(int argc, const char * argv[]) {
//    testFun1();
//    testFun2();
//    testFun3();
//    testFun4();
//    testFun5();
//    testFun6();
//    testFun7();
//    testFun8();
    testFun9();
    return 0;
}
//1.const修饰符
void testFun1(){
//    1、定义常量
//    (1)const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。

    int const Value1 = 10;
    const int Value2 = 18;
//    Value1 = 20; ❌
//    Value2 = 30; ❌
    cout<<Value1<<endl<<Value2<<endl;

//    (2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义.
//    extend const int ValueName = value;

    //2、与指针结合
    int a = 30;
    int b = 60;
    //1)指向常量的指针 指针的内容不能改变,但是指针的指向是可以改变的
    const int *p1 = &a;
    cout<<"address:"<<p1<<"   value:"<<*p1<<endl;
    p1 = &b;
//    *p1 = b;❌
    cout<<"address:"<<p1<<"   value:"<<*p1<<endl;

    const char *name = "fanhua";
    name = "chendian";
    cout<<name<<endl;
//    name[0] = 'c';❌
    //2)常指针 指针所指的内容可以改变,但是指针本身的指向不能改变
    int *const p = &a;
    cout<<"address:"<<p<<"   value:"<<*p<<endl;
    *p = b;
//    p = &b;  ❌
    cout<<"address:"<<p<<"   value:"<<*p<<endl;
    char *const nickname = "fanhua";
//    nickname = "chendian";❌
//    nickname[0] = 'c';
    cout<<nickname<<endl;
    //3)指向常量的常指针  内容和指向都不能改变
    const int* const p3 = &a;
//    p3 = &b;❌
//    *p3 = b;❌
    cout<<"address:"<<p3<<"   value:"<<*p3<<endl;

    const char* const aliasname = "chen";
//    aliasname[3] = 'd';❌
//    aliasname = "zhang";❌
    cout<<aliasname<<endl;
    /*
     const修饰指针变量时:

       (1)只有一个const,如果const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存单元。

       (2)只有一个const,如果const位于*右侧,表示指针本身是常量,不能指向其他内存地址;指针所指的数据可以通过解引用修改。

       (3)两个const,*左右各一个,表示指针和指针所指数据都不能修改。
     */
    //3、与函数结合使用const
//    void testModifyConst(const int x);在函数内部参数值不会改变;
}
/*
 2.内联函数(内置函数)
   声明 函数说明前冠以关键字 inline
    每当程序中出现对该函数的调用时,C++编译器是函数体中的代码块插入到调用函数的语句处(相当于把代码复制一份到调用位置,而不发生真正的函数调用)。
    作用:消除函数调用时候的系统开销,以提高程序的执行效率。在程序执行过程中调用函数时,系统将程序当前的一些状态信息存到栈中(例如现场和返回地址等),同时转到函数的代码处去执行函数体语句,这些参数的保存与传递的过程中须要时间和空间的开销,使得程序执行效率低。内联函数是一种牺牲空间换区时间的处理方法。
 */
inline int box(int a, int b, int c){
    return a * b * c;
}
void testFun2(){
    int e = box(1, 2, 3);
    cout<<e<<endl;
}
/*
 3.带默认参数的函数
 */
int sum(int a = 1, int b = 2, int c = 3){
    return a + b + c;
}
void testFun3(){
    int e = 0;
    e = sum();
    cout<<e<<endl;
    e = sum(100);
    cout<<e<<endl;
    e = sum(100,300);
    cout<<e<<endl;
    e = sum(100,200,300);
    cout<<e<<endl;
//    e = sum(,200);❌
}

/**
 4.函数的重载(注意:只有返回值不同构不成函数重载)
 */
int mul(int a, int b){
    return a + b;
}
int mul(int a, int b, int c){
    return a + b + c;
}
//float mul(float a, float b){
//    return a + b;
//}

double mul(double a, double b){
    return a + b;
}
float mul(float a, float b , float c, float d){
    return a + b + c + d;
}
void testFun4(){
    int e = 0;
    float f = 0.0;
    e = mul(2, 3);
    cout<<e<<endl;
    e = mul(2, 4, 5);
    cout<<e<<endl;
    double d = mul(2.4, 3.4);
    cout<<d<<endl;
    f = mul(2.4, 4.4, 5.5, 5.6);
    cout<<f<<endl;
}
/*
 5.作用域运算符::
 */
int avar = 1314;
void testFun5(){
    int avar = 0;
    avar = 520;
    cout<<"lobal: "<<avar<<endl;
    cout<<"global: "<<::avar<<endl;
    ::avar = 520;
    cout<<"global: "<<::avar<<endl;
}
/*
 6.共用体
 */
void testFun6(){
    union data{
        long int i;
        double d;
        char c;
    };
    //无名共用体
    union {
        int i;
        double d;
        float f;
    }x;
    cout<<sizeof(data)<<endl;
    cout<<&x.i<<endl;
    cout<<&x.d<<endl;
    cout<<&x.f<<endl<<endl;

    union data d;
    d.c = 'a';
    cout<<d.i<<endl;
    cout<<d.d<<endl;
    cout<<d.c<<endl<<endl;

//    x.i = 65;
//    cout<<x.i<<endl;
//    cout<<x.d<<endl;
//    cout<<x.f<<endl<<endl;
    x.d = 65.0;
    cout<<x.i<<endl;
    cout<<x.d<<endl;
    cout<<x.f<<endl;
}
/*
 7.运算符new 与 delete 动态分配内存空间
 */
void testFun7(){
    int *p;
    p = new int(10);
    if (!p) {
        cout<<"allocaction failure!\n";
        return;
    }
    cout<<*p<<endl;
    cout<<p<<endl<<endl;
    delete p;
    p = new int;
    *p = 520;
    cout<<*p<<endl;
    cout<<p<<endl<<endl;
    delete p;
    int *array = new int[3];
    array[0] = 1;
    array[1] = 2;
    array[2] = 3;
    for (int i = 0 ; i < 3; i++) {
        cout<<array[i]<<endl;
    }
    delete [] array;
}
/*
 8.引用
 建立引用的作用是为变量另起一个名字,变量的引用通
 常被认为是变量的别名。当生命了一个引用时,必须同
 时用另一个变量名来将它初始化,即声明它代表哪一个变
 量,是哪一个变量的别名。这样,对一个引用的所有操作,
 实际上都是对其所代表的变量的操作,就如同对一个人来说,
 即使有三四个名字,实际上就是同一个人,用这三四个名字
 所做的事情,其实就是那一个人所做的事情。

 类型 &引用名 = 已定义的变量名;
 */
void sample(){
    int i;
    int &j = i;
    i = 30;
    cout<<"i="<<i<<" j="<<j<<endl;
    j = 50;
    cout<<"i="<<i<<" j="<<j<<endl;

    cout<<"变量 i 的地址: "<<&i<<endl;
    cout<<"引用 j 的地址: "<<&j<<endl;
}
//引用作为函数参数
void swap(int &m , int &n){
    int temp = m;
    m = n;
    n = temp;
}
//引用作为函数返回值
int &max(int &num1, int &num2){
    return (num1>num2)?num1:num2;
}
int &min(int &num1, int &num2){
    return num1<num2?num1:num2;
}
void testFun8(){
    sample();
    int num1 , num2;
    cout<<"请输入第一个数:";
    cin>>num1;
    cout<<"请输入第二个数:";
    cin>>num2;
    cout<<"\n找出最大数,然后把最大数赋为0后,两个分别为:"<<endl;
    max(num1, num2) = 0;
    cout<<num1<<"和"<<num2<<endl;
    cout<<"现在请再输入两个数:"<<endl;
    cout<<"请输入第一个数:";
    cin>>num1;
    cout<<"请输入第二个数:";
    cin>>num2;
    cout<<"\n找出最小数,然后把最小数赋为0后,两个分别为:"<<endl;
    min(num1, num2) = 0;
    cout<<num1<<"和"<<num2<<endl;
}

/*
 9.应用举例
 */
//1)引用的理解
int &f(int &i){
    i += 10;
    return i;
}
void testSample1(){
    int k = 0;
    int &m = f(k);
    cout<<k<<endl;
    m = 50;
    cout<<k<<endl;
}

//2)用动态分配空间的方法计算Fibonacci数列的前20项
//  并存储到动态分配的空间中
/*
 斐波那契(Fibonacci)数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........
 自然中的斐波那契数列
 自然中的斐波那契数列
 这个数列从第3项开始,每一项都等于前两项之和。
 */
void testSample2Fibonacci(){
    int *p = new int[20];
    *p = 1;
    *(p + 1) = 1;
    cout<<*p<<"\t"<<*(p + 1)<<"\t";
    p = p + 2;
    for (int i = 3; i <= 20; i++) {
        *p = *(p - 1) + *(p - 2);
        cout<<*p<<"\t";
        if (i % 5 == 0) {
            cout<<endl;
        }
        p++;
    }
}
//3)百钱问题:将一元人民币兑换成1、2、5分硬币,有多少种换发?
void testSample3(){
    int n_five;
    int n_two;
    int n_one;
    int sum = 0;
    for (n_five = 0; n_five <= 20; n_five++) {
        for (n_two = 0; n_two <= 50; n_two++) {
            n_one = 100 - n_five * 5 - n_two * 2;
            if (n_one >= 0) {
                cout<<"一分:"<<n_one<<"\t二分:"<<n_two<<"\t五分:"<<n_five<<endl;
                sum++;
            }
        }
    }
    cout<<"sum = "<<sum<<endl;
}
//4)用二分法求解 f(x)=0 的根? 不理解
inline int fun(float x){
    return 2 * x * x * x - 4 * x * x + 3 * x - 6;
}
void testSample4(){
    float left, right, middle, ym, yl, yr;
    cout<<"please two number :"<<endl;
    cin>>left>>right;
    yl = fun(left);
    yr = fun(right);

    do {
        middle = (right + left)/2;
        ym = fun(middle);
        if (ym * yr > 0) {
            right = middle;
            yr = ym;
        }else{
            left = middle;
            yl = ym;
        }
    } while (fabs(ym) >= 1e-6);
    cout<<"\nRoot is : "<<middle<<endl;
}
void testFun9(){
    testSample1();
    cout<<"***********************"<<endl;
    testSample2Fibonacci();
    cout<<"***********************"<<endl;
    testSample3();
    cout<<"***********************"<<endl;
    testSample4();

}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值