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::_…………

上一篇已经提到。

C++ 基础复习 1的更多相关文章

  1. 《CSS权威指南》基础复习+查漏补缺

    前几天被朋友问到几个CSS问题,讲道理么,接触CSS是从大一开始的,也算有3年半了,总是觉得自己对css算是熟悉的了.然而还是被几个问题弄的"一脸懵逼"... 然后又是刚入职新公司 ...

  2. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  3. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  4. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  5. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  6. Java基础复习笔记系列 四 数组

    Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...

  7. C语言基础复习总结

    C语言基础复习总结 大一学的C++,不过后来一直没用,大多还给老师了,最近看传智李明杰老师的ios课程的C语言入门部分,用了一周,每晚上看大概两小时左右,效果真是顶一学期的课,也许是因为有开发经验吧, ...

  8. JS基础 复习: Javascript的书写位置

    爱创课堂JS基础 复习: Javascript的书写位置复习 js书写位置:body标签的最底部.实际工作中使用书写在head标签内一对script标签里.alert()弹出框.console.log ...

  9. MySQL学习笔记_8_SQL语言基础复习

    SQL语言基础复习 一.概述 SQL语句注释方式 1)以"#"开头直到行尾的所有内容都是注释 2)以"--"(--后还有一个空格)开头直到行尾的所有内容都是注释 ...

  10. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

随机推荐

  1. [听课笔记]Professor Michael Cusumano's New Book:" Strategy Rules: Five Timeless Lessons from Bill Gates, Andy Grove, and Steve Jobs"

    1. Look Forward, Reason Back Extrapolate, interpret, then tie vision to concrete actions2. Make Big ...

  2. sql group by+字段

    MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. 2.在group by的分组字段上,我 ...

  3. js 模拟ajax方式提交数据

    html页面 <script>function LocaluploadCallback(msg) {     document.getElementById("f_localup ...

  4. 不再以讹传讹,GET和POST的真正区别

    不再以讹传讹,GET和POST的真正区别 网上的多数答案都是错的 在 2012年05月03日 那天写的     已经有 19940 次阅读了 感谢 参考或原文 www.cnblogs.com   服务 ...

  5. jq tab

    <div id="outer"> <ul id="tab"> <li class="current">t ...

  6. SET ? DECLARE

    http://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html http://dev.mysql.com/doc/refman/5 ...

  7. ifarm 子 父页面方法如何互调

    1.iframe子页面调用父页面js函数 子页面调用父页面函数只需要写上window.praent就可以了.比如调用a()函数,就写成: 代码如下: window.parent.a(); 子页面取父页 ...

  8. Android项目框架之图片加载框架的选择

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 从Android爆发以后,自定义的控件如EditTextWithDelete.ActionBar.P ...

  9. 【Java 基础篇】【第九课】继承

    继承就是为了提高代码的复用率. 利用继承,我们可以避免代码的重复.让Woman类继承自Human类,Woman类就自动拥有了Human类中所有public成员的功能.我们用extends关键字表示继承 ...

  10. QcheckBox

    #include "dialog.h" #include "ui_dialog.h" #include <QtCore> #include < ...