C++知识点总结

1、C++中的双冒号 ::
第一种,类作用域,用来标明类的变量、函数
    Human::setName(char* name);

第二种,命名空间作用域,用来注明所使用的类、函数属于哪一个命名空间的
    std::cout << "Hello World" << std::endl;

第三种,全局作用域,用来区分局部、全局的。最容易被忽视的一种,很多时候写了一个全局函数或者想要调用一个全局函数,却发现IDE或者Editor找不到该函数,原因是因为局部函数与想要调用的全局函数名字一样,然后找了很久也找不到原因,甚至放弃解决的。其实原因就是因为 【局部变量/函数】 与 【全局变量/函数】 的名字相同,IDE无法区分,这时候加上 :: 就可以调用到全局函数,访问到全局变量了。

2、什么时候该写函数,什么时候该写类。
把重复的代码写成单独的函数,如果有许多重复顺序的函数调用,就再组织成一个函数。如果这些函数有共同的数据,可组织成一个类。

如果写一个函数,应该首先搞明白函数是哪一类:

  流程类函数,在函数中只完成主流程,即有哪几个步骤。比如启动画面,配置环境,启动主窗口,监听消息。其他的代码统统写成函数。

  功能类函数。完成某项功能、任务、作用。

3、命名空间
3.1、从库的概念说起
这得从库的概念说起,你#include进去的就是别人帮你写好的库,你可以直接调用头文件里面封装好的函数或类,比如你用的cin cout等就是c++标准库里面的函数,这样你就不用自己写一个函数cin 来实现输入功能,也不用写函数cout来实现输出功能,直接调用就可以了。除了C++标准库,一些公司封装了一些函数,实现某些强大的功能,然后拿来卖,比如微软的MFC ,Trolltech公司的Qt等,所以c++变得更加强大,不仅可以直接调用标准库,还能调用别的公司封装好的库。

3.2、命名空间诞生的原因
早期的c++库内容有限,可随着时间的推移,库的功能越来越强大,每个厂商之间可能将库里面的函数或类取了相同的名字,比如说A公司的库就可能定义了一个叫做sum的函数,而B公司也定义一个叫做sum的函数,于是就出现问题了,程序员开发时,如果同时使用了A的库,又使用了B公司的库,那么就可能出现混乱,你调用的sum到底是哪家公司的。最初,人们就想了个办法,厂商将名字取得更长更复杂来避免重复,可这样做却给编写和阅读带来了困难。后来,人们创造了命名空间这个概念(1998年),它能有效地指出某个标示符到底属于哪个库。

3.3、什么是命名空间
通过使用 namespace xxx;来说明你所用的这个函数或类来自于哪个库或者是自己写的函数。例如,C++标准程序库就把标准库库里面的函数或类的名称放在一个“叫做std的命名空间”,比如cin cout这两个函数的名字就放放在命名空间std里面,你可以通过std::cin std::cout来说明你这里使用的cin cout是来自标准库里面的函数,而不是自己写了个名字叫做cin的函数,也不是别的厂商的库里面的函数cin,但这样也比较麻烦,每次调用的话就得把cin写成std::cin,如果你想要经常可以在程序的开头使用 using std::cin;来说明以下代码所使用的cin是来自std这个命名空间,也就是标准库里面的函数。若程序需要大量地使用标准库里面的函数,就可以把using namespace std;放在程序的开头,来说明以下代码将使用标准库的函数或类,程序员不能取和标准库里面冲突的函数或类的名称,于是你就能直接使用cin cout而不必用std::cin来说明你这里的cin是std里面的。总之,通过命名空间就能有效的说明某个函数或类到底是调用了属于哪里的库。

总结概括:库的爆炸性的发展导致经常出现命名重复,从而提出了命名空间的概念,有效地说明同个名称的函数到底来自哪个库,但这导致过去几年所开发出来的代码可能不能使用,从而C++委员会对应旧版头文件重新开发了新版的头文件,命名方式相同,但不添加后缀.h。


4、怎么把程序写到内存里面?构造函数、析构函数


5、C++中类的实例化
实例化对象有两种方式,一种是在栈上实例化,另一种是在堆上实例化。
int main()
{
    // 栈上实例化
    Student stu1;
    stu1.setName("xiaoming");
    stu1.setAge(25);
    cout << "My name is " << stu1.getName() << ", I'm " << stu1.getAge() << " years old." << endl;
 
    // 堆上实例化
    Student *stu2 = new Student;
    // 访问
    stu2->setName("xiaohua");
    stu2->setAge(17);
    cout << "My name is " << stu2->getName() << ", I'm " << stu2->getAge() << " years old." << endl;
    // 释放内存
    delete stu2;
    stu2 = nullptr;
 
    return 0;
}

实例化对象注意事项:

在栈上实例化的对象,超出定义域对象资源会自动被系统回收。
在堆上实例化的对象,最后需要使用 delete 关键字来释放内存,否则会造成内存泄漏。
使用栈实例化的对象使用 “.” 来访问数据成员或成员函数,在堆上实例化的对象使用 “->” 来访问数据成员或成员函数。
释放完内存后将对象置空,防止野指针。

6、enum类型
枚举类型,我们用的比较少,什么场景下使用呢?有很多值是多个并且是固定的,比如:
一年的季节:春、夏、秋、冬 有四个结果。

/*代码
enum JiJie{c,x,q,d}
console.log(JiJie.c) // 返回0,类似数组索引

// 也可以进行赋值
enum JiJie{
  c= '春',
  x= '夏',
  q= '秋',
  d= '冬'
}
console.log(JiJie.c) // 返回'春'这个字
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值