C++语法疑点
1函数模板不支持偏特化
2类内部的typedef 必须放在最前面,不然没法用:
疑问:为什么类声明处定义的函数体中能出现在后面在声明的成员变量??因为C++对于成员函数函数体的解析是放在整个类声明完毕之后的.
3const vs nonconst member function
注意成员函数的const属性限定并不出现在重载决议中,如果在一个基类中定义了一个成员函数memfunc1(), 然后定义了它的nonconst version
则在派生类里面无论定义一个 const memberfunc1()还是nonconst memberfunc1(),都会覆盖基类的那两个函数,比如下面代码:
class Base{
public:
virtual void sayHello()
{
static int local = 0;
local++;
a = local;
cout << "hello from nonconst"<<endl;
cout << a;
}
virtual void sayHello() const
{
cout << "hello from const" << endl;
}
private:
int a;
};
class Derived:public Base
{
public:
void sayHello()
{
cout << "derived" << endl; //派生类的const 对象再也调用不了sayHello函数了
}
};
关于这一点,可以参考访问控制权限类似的设计,因为名字决议是先于访问控制权限的检查的
4函数返回值并不在name mangling之列,所以从这个角度讲,函数调用也没有达到绝对的类型安全(返回值搞错了的话编译器是检查不出来的)
5 pointer to data member
首先要意识到这是一种指针(可以赋值为nullptr,那样用%d就输出 -1),用printf(%d)输出的就是所指成员变量在类中的偏移
#include<iostream>
using namespace std; class Point3d
{
public:
//virtual ~Point3d(){} //static Point3d origin;
float x;
float y;
float z;
}; struct Base1{int val1;};
struct Base2{int val2;}; struct Derived:Base1, Base2{}; void func1(int Derived::*dmp, Derived* p, const Derived& p2)
{
cout << p->*dmp << endl;
cout << p2.*dmp << endl;
}
int main(int argc, char** argv[])
{
Point3d p;
float Point3d::*p1 = nullptr;
float Point3d::*p2 = &Point3d::x;
if(p1 == p2)
cout << "YES";
printf("%d %d\n", p1, p2);
Derived d1, d2;
d1.val1 = 2, d1.val2 = 3;
d2.val1 = 4, d2.val2 = 5;
func1(&Derived::val1, &d1, d2);
return 0;
}
6关于调用虚函数的开销
区分三种类型:普通对象,引用类型,指针类型
指针不用说,额外增加是间接性很容易理解
引用类型调用函数的格式看起来和对象类型是一致的,但调用虚函数的开销却和指针一样
普通对象调用虚函数就像调用一般的函数一样,没有额外开销
7violatile关键字修饰的作用
被volatile关键字所修饰的变量,只不过是每次使用的时候,都必须从(原始的)(存储变量内容的) 内存 中读取数据,写数据也应该要保证写到内存中去
不允许寄存器优化
8基于函数指针和直接的函数名的调用方式上完全一样:
这完全是为了方便.
还有一点,函数地址和数据地址是两个东西(一个指示代码段,一个指示数据段),所以把void*类型变量赋值成函数指针是错误的做法!
9 In C++, tentative definitions are not supported
10 One difference between C and C++, then, is the relative unimportance of the BSS data segment in C++. All global objects within C++ are treated as initialized.
C++语法疑点的更多相关文章
- 前端笔记之ES678&Webpack&Babel(上)初识ES678&Babel&let和const&解构&语法
一.ES版本简介和调试运行方法 1.1 ECMAScript简介 MDN手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript JavaS ...
- 【疑点】js中的break,continue和return到底怎么用?
转: [疑点]js中的break,continue和return到底怎么用? 为什么要说个?好像很简单,但是我也会迷糊,不懂有时候为什么要用return,然而break和continue也经常和他放在 ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- 探索C#之6.0语法糖剖析
阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...
- [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性
回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...
- Velocity初探小结--velocity使用语法详解
做java开发的朋友一般对JSP是比较熟悉的,大部分人第一次学习开发View层都是使用JSP来进行页面渲染的,我们都知道JSP是可以嵌入java代码的,在远古时代,java程序员甚至在一个jsp页面上 ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- C#语法糖大汇总
首先需要声明的是"语法糖"这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在性能上也不会带来损失.这让java开发人员羡慕 ...
随机推荐
- this 指向
this-->当前行为发生的主体就是this,但是this是谁和这个方法在哪执行的或者在哪定义的都没有半毛钱的关系 如何的区分JS中的this? 1)函数执行,看函数名前面是否有".& ...
- @font-face字体文件用法
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 简单的Hibernate入门简介
其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西, ...
- 用excel处理重复数据
我们在处理数据时,重复数据常常会对分析造成很大麻烦,因此数据整理初期一个重要的工作是排重,excel2007以上版本中有一个删除重复项功常便捷,但是每次点来点去也很麻烦,下面我们用公式来对一些重复数据 ...
- 148. Sort List -- 时间复杂度O(n log n)
Sort a linked list in O(n log n) time using constant space complexity. 归并排序 struct ListNode { int va ...
- iOS开发 iOS10推送必看
iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助. 一.简单入门篇---看完就可以简单适配完了 相对简单的推送证书以及环境的问题,我就不在这 ...
- script "text/template"
<script type="text/template" id="orgItem"> <div class="{orgClass}& ...
- java arrayCopy
int[] dest = new int[0]; int[] value = {1,2}; if(value != null && value.length>0) { int[] ...
- NetworkComms网络通信框架V3结构图
NetworkComms网络通信框架序言 来自英国的c#网络通信框架,历时五年打造,由英国剑桥的2位工程师倾情开发,最新版本V3.x版本.
- 对于服务器的识别的条件,header之类的使用
根据上一节的内容的衔接 一:urllib.request的使用 headers的一些属性 User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求Content-Ty ...