c++初学(2)

1、const

const在c语言在:
const:修饰的是一个变量,不能通过被修饰的内容去改变空间的值。
const 在c++中:
const修饰的是一个常量。它具有一些特性
(1)const常量存放在符号表中,正常情况下内存不会为其分配空间
(2)使用时,会去符号表中取值
(3)如果对const常量取地址,编译器会在内存中分配一块无名空间,但它本身不会使用

1、const在c++中的运用:
替换宏常量
2、const与define 的区别:
const:在编译的时候处理,工作是填写符号表,常量有类型,会进行作用域检测,只在符号表中有一个备份
define:在预处理的时候处理,工作是进行完全替换,常量没类型,不会进行作用域检测,在程序中可能有多个备份。
3、const与define 的相同点
都可以定义常量

#include <iostream>

using namespace std;

//c语言中const修饰变量,值可以通过其他方式改变
//c++中const 修饰的是常量,存放在符号表中,是不能改变值的。
int main()
{
    const int a = 10;
    int *pa = (int *)&a;
    *pa = 20;

//    cout << "&a =" << &a << endl;
//    cout << "pa =" << pa << endl;
//    cout << "a =" << a << endl;
//   cout << "*pa =" << *pa << endl;

    printf("摔摔打打\n");
    printf("&a = %p,pa = %p\n",&a,pa);
    printf("a = %d,*pa = %d\n",a,*pa);

    return 0;
}

2、引用1、引用的本质:常指针

int a;
int &ra = a; ra ------> int *const pa;

2、注意点:定义引用的时候必须要赋予初值

3、引用的目的
简化程序,在一定程度上可以替代指针

4、引用使用的大小
在32位机器上是4个字节

5、指针引用

6、常引用

7、函数引用

#include <iostream>

using namespace std;

//1、引用的使用类型 &别名
//引用别名的空间是被引用变量的空间
//注意:定义引用的时候必须要赋予初值
int main1()
{
    int a = 10;
    int &ra = a;        //ra 与 a是同一块空间

    ra = 20;
    cout << "a = " << a << endl;

    return 0;
}

//为什么要用引用:简化程序,在一定程度上上可以替换指针

void myswap(int *pa,int *pb)
{
    int tmp = *pa;
    *pa = *pb;
    *pb = tmp;
}

void myswap(int &pa,int &pb)
{
    int tmp = pa;
    pa = pb;
    pb = tmp;
}


int main2()
{
    int a = 10;
    int b = 20;

    myswap(&a,&b);      //运用指针交换a,b
    cout << "a = " << a << ",b = " << b << endl;

    myswap(a,b);        //运用引用交换a,b
    cout << "a = " << a << ",b = " << b << endl;

    return 0;
}

//3、引用用于结构体
struct student
{
    int id;
    char name[20];
};

void myprintf(student &rs)
{
    printf("id = %d,name = %s",rs.id,rs.name);
}

int main()
{
    student s = {10,"小白"};

    myprintf(s);

    return 0;
}

//4、引用的大小:32位系统上是4个字节
struct text
{
    int &ra;
};

int main4()
{
    printf("sizeof(text) = %d\n",sizeof(text));

    return 0;
}

3、内联函数

1、怎么定义内联函数
在函数定义前加上inline 关键字,在函数声明前加无效

2、使用内联函数的优点:
在函数调用的时候,用函数定义替换,避免函数出栈、入栈、跳转的开销。

3、内联函数与宏函数的区别
内联函数是在编译的时候处理的。
宏函数是在预处理的时候处理的

4、使用内联函数需要注意的地方:
(1) 内联函数是一种请求,可能会失败
(2)在程序运行的时候,内联函数是没有代码空间的,在编译的时候已经替换完了
因此不能对内联函数取地址(也就是内联函数不能作为回调函数)————不可调试(如果调试进入,说明内联函数请求失败了)
(3)内联函数的函数体不要太大,(没有规定,建议不要超过5行)
(4)内联函数不能有任何的循环语句
(5)内联函数不能有太复杂的判断语句

5、内联函数是存放在符号表中的
在这里插入图片描述

#include <iostream>

using namespace std;

inline int Add(int a,int b)
{
    return (a+b);
}

int main()
{
    cout << Add(1,2) << endl;

    return 0;
}

4、c++11新特性

//1、自动类推导----->auto
int main1()
{
    auto a = 10;    //a是int类型
    auto b = 'a';   // b是char类型
    auto c = 1.2;   // c是double类型
    cout << a << b << c << endl;

    return 0;
}

//2、空指针类型----->nullptr
int main2()
{
    int *p = nullptr;

    return 0;
}

//3、可以统一初始化----->所有变量都可以用{}统一初始化
int main3()
{
    int a{4};
    cout << a << endl;

    char c{'c'};
    cout << c << endl;

    int buf[5]{1,2,3,4,5};
    for(int i=0;i < 5;i++)
    {
        cout << buf[i] << endl;
    }

    int *p = new int{10};
    cout << *p << endl;

    int *pa = new int[5]{1,2,3,4,5};
    for(int i=0;i < 5;i++)
    {
        cout << pa[i] << endl;
    }
    delete p;
    delete pa;

    return 0;
}

//4、初始列表----->initializer_list<元素类型>
//提供2个函数 begin:指向列表第一个元素end:指向列表最后一个元素的下一个位置
void func(initializer_list<int> nums)
{
      auto pa = nums.begin();
      auto pb = nums.end();

      while(pa != pb)
      {
          cout << *pa << " ";
          pa++;
      }
      cout << endl;

      for(auto pa =nums.begin();pa != nums.end();pa++)
      {
          cout << *pa << " ";
      }
      cout << endl;
      for(auto num : nums)
      {
          cout << num << " ";
      }
      cout << endl;
}

int main4()
{
    func({1,2,3,4,2,1,5});

    return 0;
}

//for 新的遍历方式
//依次将buf 中的元素赋值给a
int main()
{
    int buf[10]{1,2,3,4,5,6,7,8,9,10};
    for(int a : buf)
    {
        cout << a << " ";
    }
    cout << endl;

    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值