Come up and C++ me some time ~ (chapter 7~11)

ゝ一世哀愁。 2022-08-06 10:21 196阅读 0赞
  1. Point 1: const与非const指针相互转换

如果数据类型本身并不是指针,则可以将cosnt数据或非const数据的地址赋给指向cosnt的指针,但只能将非const数据的地址赋给非const指针

  1. Point 2: C++11模板类array对象
  2. #include<iostream>
  3. #include<array>
  4. const int Seasons= 4;
  5. const std::array<std::string, Seasons>Snames= { "Spring", "Summer", "Fall", "Winter" }; //定义
  6. void fill(std::array<std::string, Seasons> *pa);
  7. Point 3: 函数指针
  8. const double * f1(const double [] , int n);
  9. const double *(*p1)(const double [] , int n)= f1;
  10. Point 4: 内联函数与宏定义

如果程序在十个地方调用同一个内联函数,则该程序会包含该函数代码的十个副本。

要使用内联函数,需满足以下三种条件之一:

1、在函数声明前加关键字inline

2、在函数定义前加关键字inline

3、在类定义中包含函数体

内联与宏:

  1. #define SQUARE(X) ((X)*(X))
  2. inline SQUARE(X) { return X*X; }

宏不能按值传递,SQUARE(C++)将C递增两次,而内联函数不会。

  1. Point 5: 引用和指针的差别

1、引用是已定义变量的别名,主要用途是用作函数的形参。通过将引用变量作为参数,函数将使用原始数据而不是其副本。

  1. int rat= 10;
  2. int &rodent= rat;

2、引用必须定义时初始化且不能初始化后被左值,不能像指针那样先声明后赋值。

3、函数返回引用时不能返回已释放内存单元的引用。

  1. Point 6: 默认参数规则

函数原型中设置默认值

  1. char *left(const char * str, int n= 1);
  2. int harpo(int n, int m= 4, int j= 5);
  3. Point 7: 函数重载规则

函数重载的关键是函数的参数列表,也称为函数特征标。如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则他们的特征标相同(与返回值无关)。C++允许定义名称相同的函数,条件是他们的特征标不同。

  1. void print(int num);
  2. void print(char *arr);
  3. void print(double d, int width);
  4. Point 8: 函数模板
  5. template <typename T>
  6. void swap(T &a, T &b);
  7. template <typename T>
  8. void swap(T *a, T *b, int n);
  9. template <typename T>
  10. void swap(T &a, T &b)
  11. {
  12. //......................................
  13. }
  14. template <typename T>
  15. void swap(T *a, T *b, int n)
  16. {
  17. //........................................
  18. }
  19. Point 9: 名字空间

1、可传递可嵌套

namespace myth{

using std::cout;

using std::cin;

using namespace elements; //可包含其他名字空间

}

using namespace myth;

cin.get();

2、统一编程理念

使用在名称空间中声明的变量,而不是使用外部全局变量和静态全局变量

不要在头文件中使用using编译指令,首先这种做法可能掩盖某些可用名称,其次包含头文件的顺序可能影响程序的行为。如果非要使用,也应将其放在所有#include指令之后

对于using声明,首选将其作用域设置为局部而不是全局,别忘了使用命名空间的主旨是简化大型编程项目的管理工作

  1. Point 10: 类的构造、析构、拷贝构造函数、深拷贝、浅拷贝

构造函数:当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数就必须为其定义提供默认构造函数。

析构函数:对象过期时将调用的函数,如果构造函数或析构函数都私有化则调用不到

拷贝构造函数:类对象之间的赋值将调用的函数,当且仅当没有定义任何拷贝构造函数时,编译器才会提供默认的拷贝构造函数,执行的就是浅拷贝

深拷贝:如果拷贝构造函数中一旦存在动态成员,浅拷贝就会出现问题。而深拷贝时对象中动态成员将动态分配空间从而避免两个变量指向同一块内存

技巧:可以声明私有拷贝构造函数来避免默认拷贝的发生,而不必定义该构造函数。如果用户尝试按值传递或函数返回该对象时将得到一个错误,从而避免按值传递或返回对象

  1. private:
  2. //拷贝构造,只是声明
  3. CExample(const CExample& C);
  4. Point 11: 运算符重载

对于成员重载运算符函数,运算符表达式中形参为运算符右边的操作数

Time Time::operator + (const Time &t) const;

Time Time::operator - (const Time &t) const;

Time Time::operator * (double mult) const;

对于非成员重载运算符函数,运算符表达式左边的操作数对于运算符参数的第一个形参,右边的操作数对于第二个形参

Time operator* (double mult, const Time &t );

发表评论

表情:
评论列表 (有 0 条评论,196人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Some Tips and Tricks about Qt

    刚刚接触qt和qt quick,遇到一些小点子、小陷阱与大家一起分享和学习。csdn中有qt大神[安晓辉][Link 1],我也不敢班门弄斧,只是跟大家一起进步、一起分享。