数据结构中C++常用的知识

2021-02-08 15:17

阅读:370

标签:ems   成员函数   入栈   函数参数   cer   als   方式   作用域   c++   

数据结构中C++常用的知识

模版

type 是函数所使用的数据类型的占位符名称。

#include 
#include 
using namespace std;
 
template 
inline T const& Max (T const& a, T const& b) 
{ 
    return a 

type 是占位符类型名称,可以在类被实例化的时候进行指定。您可以使用一个逗号分隔的列表来定义多个泛型数据类型。

#include 
#include 
#include 
#include 
#include 
 
using namespace std;
 
template 
class Stack { 
  private: 
    vector elems;     // 元素 
 
  public: 
    void push(T const&);  // 入栈
    void pop();               // 出栈
    T top() const;            // 返回栈顶元素
    bool empty() const{       // 如果为空则返回真。
        return elems.empty(); 
    } 
}; 
 
template 
void Stack::push (T const& elem) 
{ 
    // 追加传入元素的副本
    elems.push_back(elem);    
} 
 
template 
void Stack::pop () 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack::pop(): empty stack"); 
    }
    // 删除最后一个元素
    elems.pop_back();         
} 
 
template 
T Stack::top () const 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack::top(): empty stack"); 
    }
    // 返回最后一个元素的副本 
    return elems.back();      
} 
 
int main() 
{ 
    try { 
        Stack         intStack;  // int 类型的栈 
        Stack stringStack;    // string 类型的栈 
 
        // 操作 int 类型的栈 
        intStack.push(7); 
        cout 

const

  1. 指针指向的内容 8 不可改变。简称左定值,因为 const 位于 * 号的左边。
const int *p = 8;
  1. const 指针 p 其指向的内存地址不能够被改变,但其内容可以改变。简称,右定向。因为 const 位于 * 号的右边。
int a = 8;
int* const p = &a;
*p = 9; // 正确
int  b = 7;
p = &b; // 错误
  1. 自定义类型的参数传递,需要临时对象复制参数,对于临时对象的构造,需要调用构造函数,比较浪费时间,因此我们采取 const 外加引用传递的方法。并且对于一般的 int、double 等内置类型,我们不采用引用的传递方式。
#include
 
using namespace std;
 
class Test
{
public:
    Test(){}
    Test(int _m):_cm(_m){}
    int get_cm()const
    {
       return _cm;
    }
 
private:
    int _cm;
};
 
 
 
void Cmf(const Test& _tt)
{
    cout
  1. 当 const 参数为指针时,可以防止指针被意外篡改。
#include
 
using namespace std;
 
void Cpf(int *const a)
{
    cout
  1. const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值,如果我们不想修改一个调用对象的值,所有的成员函数都应当声明为 const 成员函数。
#include
 
using namespace std;
 
class Test
{
public:
    Test(){}
    Test(int _m):_cm(_m){}
    int get_cm()const
    {
       return _cm;
    }
 
private:
    int _cm;
};
 
 
 
void Cmf(const Test& _tt)
{
    cout

引用

引用很容易与指针混淆,它们之间有三个主要的不同:

  • 不存在空引用。引用必须连接到一块合法的内存。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。

引用作为函数参数

这不完全跟简单的指针用法一样,非常方便地往函数内传值。

#include 
using namespace std;
 
// 函数声明
void swap(int& x, int& y);
 
int main ()
{
   // 局部变量声明
   int a = 100;
   int b = 200;
 
   cout 

引用作为返回值

通过使用引用来替代指针,会使 C++ 程序更容易阅读和维护。C++ 函数可以返回一个引用,方式与返回一个指针类似。

当函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边。例如,请看下面这个简单的程序:

#include 
 
using namespace std;
 
double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
 
double& setValues( int i )
{
  return vals[i];   // 返回第 i 个元素的引用
}
 
// 要调用上面定义函数的主函数
int main ()
{
 
   cout 

看起来像返回了一个值,但其实因为函数类型是引用,所以返回的是变量的左值。

当返回一个引用时,要注意被引用的对象不能超出作用域。所以返回一个对局部变量的引用是不合法的,但是,可以返回一个对静态变量的引用

int& func() {
   int q;
   //! return q; // 在编译时发生错误
   static int x;
   return x;     // 安全,x 在函数作用域外依然是有效的
}

用的比较经典的例子是堆栈的top操作。

T& top() { return ( *this ) [size() - 1]; }

号外:在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。

数据结构中C++常用的知识

标签:ems   成员函数   入栈   函数参数   cer   als   方式   作用域   c++   

原文地址:https://www.cnblogs.com/samanthadigitalife/p/12771146.html


评论


亲,登录后才可以留言!