C++的基本概念一

一、第一个C++程序

#include <iostream>
using namespace std;

int main()
{
    cout << "hello world!" << endl;
}

    1、文件扩展名
        C++源代码的文件扩展名.cpp、C、cxx、c(需要指定编译语言)
        自定义的头文件依然保留.h
    2、头文件
        C++标准库的头文件不带.h,最常用的是iostream
        C语言中的头文件依然可以继续使用,stdio.h或cstdio
    3、输入输出
        cout<<输出
        cin>>输入
        endl换行
        cout和cin不再使用占位符,它可以自动识别数据类型。
        scanf和printf可以继续使用。但需要添加头文件
    4、编译器
        gcc也可以编译C++的源码,但需要添加额外的参数(-x c++)
        g++是编译C++源码的最简单的编译器,一般操作没有默认安装。
        ubuntu系统的安装指令:sudo apt-get install g++
        之前的gcc的编译参数,依然可以继续使用。
        注意:C++编译时的错误提示不是很精准,一个错误可能会产生大量的错误提示。
    5、引入了名字空间概念
        using namespace std;//std 名字空间内包含cout、cin、endl等

二、C++中的基本数据类型
    1、C++完全兼容C语言中的所有数据类型(C++几乎兼容C语言的所有语法。)。
    2、添加了bool类型、字节宽度1,数值true(非零值),false(零值)。
    3、在显示bool变量前,使用boolalpha可以以true或flase的形式显示bool值。
    4、void* 与其它类型指针的转换受到限制
        void* 不可以直接给其它类型的指针赋值,必须经过强制转换。
        任意类型的指针都可以直接给void*赋值。

三、C++中的联合、枚举、结构
    1、在C++中联合(union)、枚举(enum)、结构(struct)设计成功后,再使用不需要加关键字。
    2、枚举的检查更为严格(C++中的枚举是一种独立的数据类型)。
    3、结构成员中可以有函数,在函数中可以直接访问结构的成员。
    4、结构对象可以继续使用.或->访问成员、成员函数。
    5、结构中的成员添加了访问属性:
        public:开放的,被它修饰过的成员在任何位置都可以访问
        private:私有的,被它修饰过的成员只能在成员函数中使用
        protected:以后再说。
    6、结构在创建时会自动调用一个函数-构造函数(可以有多个,函数重载)。
        a、无返回值
        b、名字与结构相同
        c、参数可以任意
    7、结构在释放时会自动调用一个函数-析构函数。
        a、无返回值、参数
        b、~结构名

总结:

  • 函数重载:在一个结构内,C++允许函数同名,但参数需要可区分化,即同名函数在编译时,编译器可以通过参数数量或类型区分同名函数,以实现不同功能。(实际上在编译结束后,同名函数在可执行文件中并不同名,可通过nm a.out 查看)
  • #include <iostream>
    using namespace std;
    void func(int num)
    {
    	cout << num << endl;
    }
    void func(float num)
    {
    	cout << num << endl;
    }
    void func(int num1,int num2)
    {
    	cout << num1 << num2 << endl;
    }
    void func(int num1,float num2)
    {
    	cout << num1 << num2 << endl;
    }
    int main()
    {
    	int a = 50;
    	float b = 3.14;
    	int c = 40;
    	func(a);
    	func(b);
    	func(a,c);
    	func(a,b);
    }

    查看同名函数编译后,在可执行文件中的名字

    >nm /a.out
    ...
    0804864f T _Z4funcf
    08048624 T _Z4funci
    080486b4 T _Z4funcif
    0804867a T _Z4funcii
    ...
  • 函数设置默认值:在对函数进行定义时,只需对函数参数初始化即可,初始化的值,即为默认值。重要的一点,当只有部分参数需要设置默认值时,则被设置默认值的参数应置于参数列表的右边,没有设默认值的参数应置于左边,避免函数传参出现歧义。
  • #include <iostream>
    using namespace std;
    void func(int num1,int num2 = 10)
    {
    	cout << num1 << num2 << endl;
    }
    int main()
    {
    	func(10);
    	func(20,40);
    }
  • 变量的引用(&):引用即为映射,也可理解为取别名,映射的全部成员共享一个变量,一变全变。重点,引用者在定义时就需要被初始化,而且被引用者也应有确切的值。并且,引用者一旦引用一次,就不会再次引用,相当引用操作前面添加了const。其次,被引用者还可以是常量,但必须使用const修饰。(引用在函数传参具有指针的效果
  • #include <iostream>
    using namespace std;
    int main()
    {
    	int name = 100;
    	const int & big = 40;
    	cout << big << endl;
    	//const int & bigman = name;
    	int & bigman = name;
    	cout << bigman << endl;
    }

        练习:定义一个函数,计算两个整数的最大公约数和最小公倍数,最大公约数用返回值返回,最小公倍数用引用返回。

  • #include <iostream>
    using namespace std;
    void swap(int& a,int& b)
    {
    	int c = a;
    	a = b;
    	b = c;
    }
    int func(int a,int b,int& c)
    {
    	int d = 0;
    	//
    	for(c = a < b ? a : b;c >= 1;c--)
    	{
    		if(0 == a%c && 0 == b%c) break;
    	}
    	//
    	for(d = a > b ? a : b;d <= a * b;d++)
    	{
    		if(0 == d%a && 0 == d%b) break;
    	}
    	return d;
    }
    int main()
    {
    	int num1 = 12;
    	int num2 = 18;
    	swap(num1,num2);
    	cout << num1 << " " << num2 << endl;
    
    	int div = 0;
    	int mul = 0;
    	div = func(num1,num2,mul);
    	cout << div << " " << mul << endl;
    }
  • 变量内存申请与释放:new、delete 运算符可以自动调用类的构造函数和析构函数,并且new返回的是有类型指针不同于malloc(void*)。注意,使用new对变量的初始化、数组的初始化、结构的初始化等操作的格式,以及数组内存释放的delete的格式。
  • int* nump = new int(100);//变量
    int* strp = new int[10]{0,1,2,3,4,5,6,7,8,9};//数组
    Date* date = new Date(a,b);//类,需要传参
    delete nump;
    delete date;
    delete[] strp;
  • 数据结构:结构、枚举、联合(相关格式及用法)
  • union Data
    {
    	int num;
    	char ch[6];
    };
    enum Key
    {
    	key_up = 183,
    	key_down = 184,
    	key_right = 185,
    	key_left = 186
    };
    struct Student
    {
    	char name[20];
    	char sex;
    	int age;
    
    	void show_stu(void)
    	{
    		cout << name << " " << sex << " " << age << endl;
    	}
    };
    
    int main()
    {
    	//联合
    	Data d;
    	cout << sizeof(d) << endl;
    	//枚举
    	Key k = key_up;
    	cout << k << endl;
    	//结构
    	Student t = {"heheh",'m',20};
    	t.show_stu();
    }
    

练习:使用结构Maze封装走迷宫游戏:自行设置15*15大小的迷宫的出口和入口,以及迷宫内的空格数,通过私有类方法生成迷宫,并测试迷宫的可行性,再将迷宫打印出来,进行挑战(参考代码https://gitee.com/ZhongShengXueXi/codes/gthzfj6u4lp7enmrdoc8356

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值