zoukankan      html  css  js  c++  java
  • C++ 基础复习 1

    1. 友元

    友元的作用是,友元函数内部可以直接访问外围类的private的字段或方法。通俗的理解就是解决了访问权限的问题。

    1) 有点像java的内部类,但是只能在外围类中声明,定义(实现)部分要写在外围类外面,否则编译报错:

    类定义不能被声明成友元

    2) 不仅类可以这样使用,函数也可以这样使用

    3) 友元函数要想访问外围函数中的字段,则需要在友元函数的参数中里 有外围类的引用,比如:

    string toString(Person &person);

    2. 指针与引用

    c++中  & * 这两个操作符好麻烦,

    浅谈C++中指针和引用的区别

    这篇文章总结的不错,比较清晰。

    1) 指针作为函数参数:

    方法声明了指针类型的参数,调用时有两种情况

    比如方法声明如下:

    void test(int* p){
        int a = 1;
        p = &a;
        cout<<p<<"  "<<*p<<endl;
    }

    调用test时,

    可以传递&x(假设定义了  int x = 100;),即test(&x);

    也可以传递p1(假设定义了  int* p1 = NULL;),即test(p1);

    第一种情况传递的是x的地址,test函数内的操作会对x产生影响

    第二种情况传递的是p1的值,传值将p1的值复制了一份传递给了test,test函数内的操作不会对外面的p1指针值产生影响,p1的值仍然是NULL

    完整程序如下:

    #include<iostream>
    
    using namespace std;
    
    
    void test(int* p){
        int a = 1;
        p = &a;
        cout<<p<<"  "<<*p<<endl;
    }
    
    int main(void){
        int *p = NULL;
        test(p);
        if (p == NULL){
            cout<<"P is null"<<endl;
        }
        return 0;
    }

    2) 引用作为函数参数传递

    这是比较易混淆的

    void test(int &a);

    声明时时int型的引用(可以理解成变量名),调用时直接送变量名就可以:

    代码如下:

    #include<iostream>
    
    using namespace std;
    
    void test(int &a){
        cout<<&a<< " "<<a<<endl;
    }
    
    int main(void){
        int a = 100;
        test(a);
        cout<<&a<< " "<<a<<endl;
        return 0;
    }

    输出结果为:

    0x7fff313b99ac 100
    0x7fff313b99ac 100

    这足以说明用引用进行参数传递时,事实上传递的是实参本身,而不是拷贝。

    3) 引用与指针连起来作为函数参数

    直接看示例代码:

    #include<iostream>
    
    using namespace std;
    
    void test(int *&p){
        int a = 100;
        p = &a;
        cout<<p<<"  "<<*p<<endl;
    }
    
    int main(void){
        int *p1 = NULL;
        test(p1);
        cout<<p1<<"  "<<*p1<<endl;
        return 0;
    }

    结果:

    0x7fff634ba3bc  100
    0x7fff634ba3bc  100

    也就是指针加引用连起来用,可以改变外围指针的值

    4) 指针与指针连起来作为函数参数

    另:

    指针是地址,引用是变量名;

    指针可以多级,引用不能多级;

    引用只能在定义时被初始化一次,之后不可变;指针可变;

    引用使用时无需解引用(*),指针需要解引用;

    对于类来说:变量直接声明 后可以赋给引用,使用new之后可以赋给指针(当然对于类的指针,除了new之外还可以用&变量名的方式(传统方式))

    引用用点号调用其方法,指针用->调用其方法

    代码如下:

    int main(){
        Person p;
        Person &r = p;
        cout<<r.getAge()<<endl;
        Person *p1 = new Person();
        cout<<p1->getAge()<<endl;
        return 0;
    };

    3. 编译问题

    1) ubuntu 上编译报错: undefined reference to `std::cout'…

    参见这篇,用g++ 而不是gcc

    2) mac上编译报错:

    Undefined symbols for architecture x86_64:

      "std::__1::locale::use_facet(std::_…………

    上一篇已经提到。

  • 相关阅读:
    软件开发模型
    Java学习--数组
    10年软件测试经验
    Log4net
    文件下载界面
    VB.NET中文双引号的处理方法
    SOAPUI使用
    .net数字转换成汉字大写
    SQL调用Webservices
    SQL大小写金额转换
  • 原文地址:https://www.cnblogs.com/simoncook/p/5272281.html
Copyright © 2011-2022 走看看