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. Tesseract 对验证码的识别原理和实现步骤

    一. Steps: 学习图片库--->处理图片(初步处理)--->校正.学习图片 二. Tesseract: 1. 采集图片库(一般每个出现的字符出现20次左右识别效果比较好),根据图片特 ...

  2. ios-滚动导航条页面

    // ViewController.m #import "ViewController.h" #import "ScrollSliderView.h" @int ...

  3. html 符号大全

    ░ ▒ ▬ ♦ ◊ ◦ ♠ ♣ ▣ ۰•● ❤ ●•۰► ◄ ▧ ▨ ♨ ◐ ◑ ↔ ↕ ▪ ▫ ☼ ♦ ♧♡♂♀♠♣♥❤☜☞☎☏⊙◎ ☺☻☼▧▨♨◐◑↔↕▪ ▒ ◊◦▣▤▥ ▦▩◘ ◈◇♬♪♩♭♪の ...

  4. LR中的C语言问题

    今天在调试LR的脚本(C)时遇到了几个甚是头痛得问题,下面简单总结下: 1.首先LR中的C编译器遵循C90标准,规定在一个函数中,变量定义必须放在所有的执行语句之前!一旦在运行语句之间再有定义的话,会 ...

  5. Android progressbar 详解

    [原文Android学习笔记(十六)进度条] ProgressBar XML属性 属性名 描述 android:animationResolution 超时的动画帧之间的毫秒 :必须是一个整数值,如“ ...

  6. java正则表达式取括号里面的内容

    public static String changeCompName(String compName){ String NewCompName=""; //cm1230NHL6X ...

  7. 利用sqlserver日志恢复数据

    如果你已经急的焦头烂额,看到这篇文章的时候,请你换个坐姿,深呼吸几次,静下心来将这篇文章读完,也许你的问题迎刃而解. 我遇 到的情况是这样的,网站被植入木马,盗取了我的web.config文件,web ...

  8. 常用ARM汇编指令

    常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区  作者:xuyuanfan77 [字体:大 中 小]     在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...

  9. 回退(pop&present)到根页面(根控制器)的方法,很不错~

    http://blog.csdn.net/assholeu/article/details/45897035

  10. 默认的app.js

    我们通过npm start 默认入口是app.js,如果想默认入口改为main.js,可以修改项目下的/bin/www文件把app修改main var app = require('../app');